2014-10-01 61 views
3

我们正试图尽可能地分离出我们的系统。我们理想地喜欢微服务只做一件事,而且一件事情很好。他们不应该知道依赖关系。他们应该从队列中抽出一份工作,完成工作,并以某种方式发出一份完成工作的事件(我会回到这个)。如何在微服务架构中建模服务依赖关系?

我们的系统包含“快照”(图片)作为基础,原子单位。 “事件”是最大长度为5分钟的快照分组。

一旦我们收到快照到我们的系统中,并确定它们属于哪个事件,我们将这些快照排入RabbitMQ实例,以便执行一些图像分析。然后我们有“快照分析仪”微服务拉下这个队列并执行图像分析。这些微服务直接写入数据库,为图像对象附加更多的元数据。这些也是无国籍的,并且易于水平扩展。

问题是,在快照分析仪已完成其工作后,有任务需要完成。如果我们检测到快照上的某些属性,我们希望使用“事件分析器”对该事件执行工作。我们不希望多次对此事件进行工作(因此,如果多个快照具有这些属性,则无关紧要 - 我们仍然只想在事件上执行该操作)。这对于设计人员来说非常具有挑战性,特别是在分布式环境中,我们有几个这样的图像分析仪正在退出队列。我们目前所做的是,如果我们在快照上检测到这些属性(意味着我们希望在包含此快照的事件上完成工作),我们会将其写入事件。如果是第一次写入事件,我们将它排入我们的第二个队列以进行事件处理。这确保了该事件只能排队一次。是

与上述方法的问题如下:快照分析器和事件分析器生命快照分析器内部之间

  • 依赖。理想情况下,我希望快照分析器不了解事件分析器。它应该只是做它的工作,而不关心排队的事情。我不确定这个依赖关系应该在哪里编码。
  • 找出排队事件,当该事件的多个快照正在同时处理。如何只参加一次赛事的参赛作品。当调用$ set时,我们“滥用”MongoDB的原子更新,返回它是否成功。

有没有人有任何想法或如何声明相似的依赖关系的例子?我需要一个调度员服务,负责排队等待正确的事情,并从一个工作完成队列或其他东西拉。

回答

1

最终,您的问题是需要在全球范围内同步分布式处理系统。这是一个非常古老的问题,大多数人通过使用数据库内置的功能来处理分布式系统的同步,以完全修复它的方式修复它。还有很多其他的方法,但是如果你已经在使用一个很好的基础设施(和大多数数据库),那就继续并利用它。

我想说的另一个问题(解耦快照分析器从事件分析器),你必须让快照分析器意识到需求只分析一次事件(像你一样),或有事件分析人员意识到这一要求。如果你的快照分析器只是为事件分析器盲目排队消息,并且让事件分析器成为数据库避免重复处理的工作,那么你将很好地封装需求,同时向添加额外消息的警告队列。这有一个好处,就是你有一个阻塞点,你可以将这些内容累积到一个阻塞点,而不必进行外部数据库调用。