我们正试图尽可能地分离出我们的系统。我们理想地喜欢微服务只做一件事,而且一件事情很好。他们不应该知道依赖关系。他们应该从队列中抽出一份工作,完成工作,并以某种方式发出一份完成工作的事件(我会回到这个)。如何在微服务架构中建模服务依赖关系?
我们的系统包含“快照”(图片)作为基础,原子单位。 “事件”是最大长度为5分钟的快照分组。
一旦我们收到快照到我们的系统中,并确定它们属于哪个事件,我们将这些快照排入RabbitMQ实例,以便执行一些图像分析。然后我们有“快照分析仪”微服务拉下这个队列并执行图像分析。这些微服务直接写入数据库,为图像对象附加更多的元数据。这些也是无国籍的,并且易于水平扩展。
问题是,在快照分析仪已完成其工作后,有任务需要完成。如果我们检测到快照上的某些属性,我们希望使用“事件分析器”对该事件执行工作。我们不希望多次对此事件进行工作(因此,如果多个快照具有这些属性,则无关紧要 - 我们仍然只想在事件上执行该操作)。这对于设计人员来说非常具有挑战性,特别是在分布式环境中,我们有几个这样的图像分析仪正在退出队列。我们目前所做的是,如果我们在快照上检测到这些属性(意味着我们希望在包含此快照的事件上完成工作),我们会将其写入事件。如果是第一次写入事件,我们将它排入我们的第二个队列以进行事件处理。这确保了该事件只能排队一次。是
与上述方法的问题如下:快照分析器和事件分析器生命快照分析器内部之间
- 依赖。理想情况下,我希望快照分析器不了解事件分析器。它应该只是做它的工作,而不关心排队的事情。我不确定这个依赖关系应该在哪里编码。
- 找出排队事件,当该事件的多个快照正在同时处理。如何只参加一次赛事的参赛作品。当调用$ set时,我们“滥用”MongoDB的原子更新,返回它是否成功。
有没有人有任何想法或如何声明相似的依赖关系的例子?我需要一个调度员服务,负责排队等待正确的事情,并从一个工作完成队列或其他东西拉。