- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须建立一个运动检测服务。运动检测不适用于视频,而仅适用于静止图像。
该微服务需要能够无序接收图像(带有时间戳)和 找出图像是否与之前拍摄的图像不同 (时间戳早于它)。将需要多个运动检测工作人员。
因此,关键要求似乎是:
最佳答案
具有多个生产者和多个消费者的图像队列在这里似乎是正确的方法。对于这个答案的其余部分,我将从这个队列的细节中抽象出来,因为这些细节取决于生产者和消费者的位置(物理上在哪台机器上)。
以下是在消费者端要做的事情:
暂时保留图片在内存中 在 hash table .键是时间戳,值是指向图像内容(以及您可能想要保留的任何元数据)的指针。一旦将图像与连续时间戳的图像进行比较,就可以将图像从哈希表中删除。
您的消费机器需要有足够的工作内存来存储图像。如果在给定的时间戳与其之前或之后的时间戳之间平均收到 100 张图像,并且图像的平均大小为 1MB,则这些图像总共将占用 100 * 2 * 1MB = 200MB 的内存。
创建第二个内存队列以跟踪尚无法比较的图像。如果在接收具有当前时间戳的图像时无法从哈希表中获得具有上一个时间戳的图像,则工作人员会将带有时间戳的图像指针放入该队列。第二组工作人员从这个队列中获取时间戳,并测试前一个时间戳的图像是否同时可用。如果是,则比较图像,否则将图像和时间戳推回到队列中。
第一组和第二组工作人员的相对大小应与其直接后继人员之前到达的图像的相对频率成正比。换句话说,如果图像有 60% 的时间在其直接后继者之前进入哈希表(因此图像在其直接后继者之后到达的时间为 40%),则 60% 的工作人员应该在第一组中,而 40%应该在第二组。或者,您可以根据需求动态地将工作人员分配给一个集合;如果无序行为往往波动很大,例如取决于一天中的时间,这可能是合适的。
具有单个消费者的第三个队列负责更新数据库。第三个队列可能跨网络也可能不跨网络,就像第一个队列一样。在前两组中的工作人员比较了两个连续的图像后,它将结果推送到第三个队列中。这个队列的消费者获取队列的内容并将它们同步到数据库。它可以通过每几个(比如 10 个)比较的一个事务来实现这一点,以最大限度地减少延迟,或者每秒将所有内容集中在一个事务中,以最大限度地提高吞吐量。不要为每个图像比较单独创建事务,这可能会比您想要的慢得多。
图像比较 worker 都需要读取和更新哈希表,因此您需要一种机制来防止竞争条件。在这种情况下,锁定机制是不合适的,因为它可能会成为您的应用程序的瓶颈。取而代之的是,让单个工作人员专门管理散列表,并让所有比较工作人员通过读取/插入队列向散列表管理器发送请求。由于管理器的工作相对较轻(存储、检索和删除图像指针),它应该能够在大多数时间保持在读取/插入队列的前面。
当一个worker发出一个读请求时,它会等待管理器的回复(而不是当它发出一个插入请求时)。它可能会传递回调和 sleep ,或者输入自旋锁检查共享变量的“回复就绪”值(取决于您的编程环境,这可能归结为相同的事情)。当然,您根本不想让您的工作人员等待,但大多数等待将非常短暂,而且这种方法肯定会比全局锁定方法更快。
在首次从哈希表中成功检索到图像后,管理器可以从表中删除该图像(因为只会请求该图像与后续图像进行比较)。管理器应该从哈希表中删除指针,而不是删除图像本身。您可以使用 reference counting以确定何时应从内存中完全清除图像。虽然引用计数需要锁定或原子化,但这不会成为瓶颈,因为在任何给定时间最多有两个工作人员访问图像,大多数情况下不会直接影响引用计数。
备注
在上面的设计中我没有讨论图像何时进入永久数据库。这很可能发生在生产者端,在图像进入第一个队列之前。或者,我讨论过的第三个队列中的数据库同步代理可能会这样做。您不想让您的比较 worker 或哈希表管理器承担此责任。
如果您认为我的回答很有希望,我愿意提供额外的文档,例如(极简)流程图、工作人员的伪代码算法或粗略的数据流流量配置文件。
关于architecture - 消息需要访问共享数据时的消息队列架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24944819/
如果您设计分布式应用程序以实现轻松扩展,或者您只想使用 Amazon、Google 或 Microsoft 提供的任何新的“云计算”产品,那么您通常最终会使用一些典型的概念或组件: 分布式 blob
根据uncle Bob's Clean Architecture 、企业和应用程序业务规则(概念上由命令组成)位于外部接口(interface)层之下的层中。因此,无论何时调用接口(interface
我在网上找不到它的任何实现实际上为您提供了一种与框架无关且实用的实现方式。 我已经看到了几个解决它的低于标准的建议: 使存储库方法成为原子 使用例原子化 它们都不是理想的。 案例#1 :大多数用例依赖
我正在查看 Sparkle 项目的配置并注意到它们设置: 架构 = ppc i386 x86_64 有效架构 = i386 x86_64 来自苹果的有效架构描述: Space-separated li
只听本周的podcast并认为将您的一些经验组合在一起会很好,在这些经验中,您已经看到设计的“架构”方面比应有的支配更多东西。 Java 在这方面经常受到负面报道,而且随着 Java EE 的复杂性增
我正在阅读 Bob Martin (https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html) 的清洁架构
OSGi是模块化架构,JavaBeans是组件架构。有什么区别? 最佳答案 OSGi 和 Java Beans 之间的主要区别在于类加载器的工作方式。在标准 .jar 文件或 EJB 中,rt.jar
我对 Clean Architecture 中的 Gateway to Entity 依赖有疑问。我认为以下同心圆图形经常被介绍为整洁的架构。 在上图中,Gateway并没有直视Entity。但是,还
我试图理解 TOGAF 9 的核心概念。 无论我多长时间阅读 TOGAF 手册中的解释,我都无法理解 Enterprise Continuum 和 Architecture Repository 之间
如果 Kappa 架构直接对流进行分析,而不是将数据拆分为两个流,那么在像 Kafka 这样的消息系统中,数据存储在哪里?或者它可以在数据库中进行重新计算? 单独的批处理层是否比使用流处理引擎重新计算
它们的含义是什么,我可以将它们设置为不同的值吗? 最佳答案 架构是您想要构建的架构,有效的架构是您可以设想使用您的代码库构建的架构。 所以也许您只想为 armv7 构建二进制文件,但相同的源代码可以为
我现在正在尝试在 Xcode 4.0 中构建的项目遇到问题,希望有人可以为我解释一下。 我正在尝试使用 ZBar SDK 并遵循此处概述的指南中概述的说明: http://zbar.sourcefor
在基于 Apple Silicon 的机器上使用 Interface builder 时,我当前的项目会引发 IBDesignable 错误。 我尝试排除用于调试的 arm64 架构,以及我在互联网上
Xcode 项目中出现警告: crypto was rejected as an implicit dependency for 'libcrypto.a' because its architect
我正在 Xcode 5 中开始新项目。我想使用 iOS SDK 7 开发应用程序,但部署目标为 iOS 5.0。当我在 Xcode 中创建新项目并尝试将部署目标更改为 5.0 时,我收到了这条消息:
编辑 :这个问题可能是旧的,它与 xcode 3 有关。 我正在开发一个需要 voip 支持的 iPhone 应用程序,所以我添加了 pjsip 的 ARM 版本图书馆。但如果我使用 iPhone 模
我们最近将最低 iOS 支持设置为 4.0,并开始使用 LLVM 编译器对当前可用的应用程序进行新更新。 将“架构”和“有效架构”设置为仅 armv7 是否会排除 iPhone 3G 等 armv6
我想在我的 64 位机器上启用额外的架构(32 位)。我做了 dpkg --print-architecture 来了解已知的架构,即 amd64 。之后我做了 dpkg --print--forei
操作系统:OS X Yosemite 版本 10.10.1 XCode:未安装 应用程序加载器3.0 (620) PhoneGap:3.7.0 PhoneGap 构建:在线 (build.phoneg
我们已经构建了一个具有多个 native 绑定(bind)的 Xamarin 应用程序(iOS、Android)。该应用程序在设备和模拟器上运行良好,我们能够毫无问题地构建存档(显然)。 问题是当我们
我是一名优秀的程序员,十分优秀!