Architecture 消息需要访问共享数据时的消息队列体系结构
我必须建立一个运动检测服务。运动检测不在视频上运行,而是在静止图像上运行 该微服务需要能够接收无序的图像(带有时间戳),并确定图像是否与之前拍摄的图像不同(带有早于它的时间戳)。需要多个运动检测人员 因此,关键要求似乎是:Architecture 消息需要访问共享数据时的消息队列体系结构,architecture,message-queue,motion-detection,Architecture,Message Queue,Motion Detection,我必须建立一个运动检测服务。运动检测不在视频上运行,而是在静止图像上运行 该微服务需要能够接收无序的图像(带有时间戳),并确定图像是否与之前拍摄的图像不同(带有早于它的时间戳)。需要多个运动检测人员 因此,关键要求似乎是: 一个web服务可以按顺序接收图像,能够将它们分成前一对和下一对,然后计算一个图像与前一个图像相比是否有运动 许多图像制作人平均每秒似乎有100张左右的图像 许多运动检测消费者 优先考虑延迟而不是吞吐量 不易独立使用的任务 我正在考虑使用单个消息队列。生产者将图像文档推送到队列
我认为您的问题来自于尝试对许多图像制作者使用单个队列。这会导致图像集中在一起,然后需要解开图像序列 我的方法是将图像流到带有时间戳的目录和文件中。不要混用图像制作人,让他们分开。然后很容易扫描文件并用
差异百分比标记它们
例如,图像生成器#1将文件存储在目录/IP1/date/time/sequence
中,其中date
类似于20140727(2014-07-27),time
类似于1542(3:42pm),sequence
是一个从1到6000的计数器(最高每秒100帧,每分钟60秒)。为其他图像制作者复制此结构。通过这种方式,映像独立于工作进程进行存储,并且不存在队列或数据库的瓶颈
然后,并行运行您想要的尽可能多的消费者,这些消费者可以醒来,处理一大块图像,并在文件用完时进入睡眠状态。它们需要在单独的目录上工作,从而彼此独立工作。我会让他们为每个图像添加带有diff_percentage
的文件到目录中,并且在目录(time
或date
)完成时添加另一个文件。这使得它们很容易重新启动并赶上,以防意外停止
这是旧的“方法”。通过使图像流保持分离,可以更容易地在消费者进程之间分配工作。具有多个生产者和多个消费者的图像队列似乎是正确的方法。对于这个答案的其余部分,我将从这个队列的细节中抽象出来,因为这些细节取决于生产者和消费者所在的位置(物理上在哪台机器上)
以下是在消费者端要做的事情:
将图像暂时保存在内存中。键是时间戳,值是指向图像内容(以及您可能希望保留的任何元数据)的指针。一旦将图像与连续时间戳的图像进行比较,就可以从哈希表中删除图像
您的消费机器需要有足够的工作内存来存储图像。如果在给定时间戳和该时间戳之间直接在其之前或之后接收到平均100个图像,并且图像的平均大小为1MB,则这些图像将一起占用100*2*1MB=200MB的内存
创建第二个内存队列,以跟踪尚无法比较的图像。如果在接收具有当前时间戳的图像时,具有上一个时间戳的图像无法从哈希表中获得,则工作人员会将具有其时间戳的图像指针放入该队列。第二组worker从这个队列中获取时间戳,并同时测试前一个时间戳的映像是否可用。如果是这样,它会比较图像,否则会将图像和时间戳推回到队列中
第一组和第二组工作人员的相对大小应与其直接后续人员之前到达的图像的相对频率成比例。换句话说,如果60%的时间图像在其直接后继图像之前进入哈希表(因此40%的时间图像在其直接后继图像之后到达),则60%的辅助图像应位于第一组,40%的辅助图像应位于第二组。或者,您可以根据需要动态地将工作人员分配到集合;如果出现故障,这可能是适当的