首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在微服务体系结构中建模服务依赖关系?

如何在微服务体系结构中建模服务依赖关系?
EN

Stack Overflow用户
提问于 2014-10-01 01:17:25
回答 1查看 971关注 0票数 3

我们正试图以尽可能解耦的方式构建我们的系统。理想情况下,我们希望微型服务只做一件事,而且有一件事做得好。他们不应该知道依赖关系。他们应该从队列中获取一个作业,完成作业,并以某种方式发出一个作业完成事件(我将回到这里)。

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

一旦我们接收到系统中的快照,并确定它们属于哪个事件,我们就将这些快照排队到一个RabbitMQ实例中,以便执行一些图像分析。然后,我们让"snapshot-analyser“微服务从队列中取出并执行图像分析。这些微服务直接写入数据库,在图像对象中附加更多元数据。它们也是无状态的,并且易于横向扩展。

问题是,在snapshot-analyser完成其工作之后,还有一些任务要完成。如果在快照中检测到某些属性,则希望使用"event-analyser".对该事件执行工作。我们不想对这个事件执行不止一次的工作(因此,如果多个快照具有这些属性,那么这并不重要--我们仍然只想在事件上工作一次)。这对工程师来说是很有挑战性的,特别是在分布式环境中,我们有几个这样的图像分析器从队列中取出。我们目前要做的是,如果我们在快照上检测到这些属性(这意味着我们希望对包含此快照的事件完成工作),则将其写入事件。如果这是第一次写入事件,则我们将其排队到第二个队列中进行事件处理。这确保事件最多排队一次。

上述方法的问题如下:

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

有没有人有类似的依赖声明的想法或例子?我是否需要一个分配器服务,负责排队到正确的东西,并从一个作业完成的队列或其他东西。

EN

回答 1

Stack Overflow用户

发布于 2014-10-01 14:00:42

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26132691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档