如何在微服务架构中建模服务依赖?

时间:2014-10-01 01:17:25

标签: service architecture message-queue soa

我们正在努力以尽可能脱钩的方式构建我们的系统。我们理想地喜欢微服务只做一件事,一件好事。他们不应该知道依赖关系。他们应该从队列中找到一份工作,完成工作,并以某种方式完成工作完成事件(我将回到此处)。

我们的系统包含" 快照" (图像)作为基础,原子单位。 " 活动"是一组快照,最大长度为5分钟。

一旦我们收到快照进入我们的系统,并确定它们属于哪个事件,我们将这些快照排入RabbitMQ实例,以便执行某些图像分析。然后我们有" 快照分析器"微服务拉出这个队列并进行图像分析。这些微服务直接写入数据库,向图像对象添加更多元数据。这些也是无状态的,并且易于水平扩展。

问题是,快照分析器完成其工作后,有一些任务要完成。如果我们检测到快照上的某些属性,我们希望使用" event-analyzer" 对该事件执行工作。我们不想多次执行此活动的工作(因此,如果多个快照具有这些属性,则无关紧要 - 我们仍然只想对事件做一次)。这对工程师来说非常具有挑战性,特别是在分布式环境中,我们有几个这样的图像分析仪从队列中拉出来。我们目前所做的是,如果我们在快照上检测到这些属性(意味着我们希望在包含此快照的事件上完成工作),我们将其写入事件。如果它是写入事件的第一次,我们将它排入我们的第二个队列进行事件处理。这可确保事件仅排队一次。

上述方法的问题如下:

  • 快照分析器和事件分析器之间的依赖关系存在于快照分析器中。理想情况下,我希望快照分析器不了解事件分析器。它应该只是做它的工作,而不是在乎任何事情。我不确定这个依赖项应该编码在哪里。
  • 在同时处理该事件的多个快照时,确定对事件进行排队。如何只为事件排队,只需一次。我们"滥用"当调用$ set时,MongoDB的原子更新返回是否成功。

有没有人有任何关于如何声明相似依赖关系的想法或例子?我是否需要一个调度程序服务,该服务负责排队到正确的事情,并从完成任务的队列或其他东西中提取。

1 个答案:

答案 0 :(得分:1)

最终,您的问题是需要全局同步分布式处理系统。这是一个非常古老的问题,大多数人通过使用他们的数据库来解决问题。内置处理分布式系统同步的功能。还有很多其他方法,但是如果你已经使用了一个能很好地完成它的基础设施(并且大多数数据库都这样做),那么继续使用它。

我说的是另一个问题(将快照分析器与事件分析器分离),您必须让快照分析器知道要求只分析一次事件(就像您一样),或者事件分析器了解需求。如果你有快照分析器只是盲目地为事件分析器排队,并且让事件分析器成为数据库工作以避免双重处理的事件,你将很好地封装需求,并注意添加额外的消息给队列。这有一个好处,你有一个阻塞点,你可以在一个阻塞点积累这些内存,而不必进行外部数据库调用。