我们正试图以尽可能解耦的方式构建我们的系统。理想情况下,我们希望微型服务只做一件事,而且有一件事做得好。他们不应该知道依赖关系。他们应该从队列中获取一个作业,完成作业,并以某种方式发出一个作业完成事件(我将回到这里)。
我们的系统包含“快照”(图像)作为基础,原子单位。“事件”是一组快照,最大长度为5分钟。
一旦我们接收到系统中的快照,并确定它们属于哪个事件,我们就将这些快照排队到一个RabbitMQ实例中,以便执行一些图像分析。然后,我们让"snapshot-analyser“微服务从队列中取出并执行图像分析。这些微服务直接写入数据库,在图像对象中附加更多元数据。它们也是无状态的,并且易于横向扩展。
问题是,在snapshot-analyser完成其工作之后,还有一些任务要完成。如果在快照中检测到某些属性,则希望使用"event-analyser".对该事件执行工作。我们不想对这个事件执行不止一次的工作(因此,如果多个快照具有这些属性,那么这并不重要--我们仍然只想在事件上工作一次)。这对工程师来说是很有挑战性的,特别是在分布式环境中,我们有几个这样的图像分析器从队列中取出。我们目前要做的是,如果我们在快照上检测到这些属性(这意味着我们希望对包含此快照的事件完成工作),则将其写入事件。如果这是第一次写入事件,则我们将其排队到第二个队列中进行事件处理。这确保事件最多排队一次。
上述方法的问题如下:
有没有人有类似的依赖声明的想法或例子?我是否需要一个分配器服务,负责排队到正确的东西,并从一个作业完成的队列或其他东西。
发布于 2014-10-01 14:00:42
最终,您的问题是需要全局同步分布式处理系统。这是一个非常老的问题,大多数人通过使用他们的数据库内置的功能来处理分布式系统的同步来解决这个问题。还有很多其他的方法,但是如果您已经在使用一条基础设施,并且大多数数据库都这样做了,那么就继续使用它吧。
对于另一个问题(将快照分析器与事件分析器分离),您必须让快照分析器知道只分析一次事件的需求(就像您一样),或者让事件分析器知道需求。如果您有快照分析器只是盲目地为事件分析器排队消息,并且有事件分析器来完成数据库工作以避免双重处理,那么您将很好地封装这个需求,并在队列中添加额外的消息。这有一个好处,因为您有一个阻塞点,您可以在一个阻塞点将这些东西积累到内存中,而不必进行外部数据库调用。
https://stackoverflow.com/questions/26132691
复制相似问题