Events 如何在消息驱动的微服务系统中处理基于多个事件的副作用?

Events 如何在消息驱动的微服务系统中处理基于多个事件的副作用?,events,apache-kafka,state,event-sourcing,Events,Apache Kafka,State,Event Sourcing,我们目前正在一个消息驱动的微服务环境中工作,我们的一些消息/事件是事件源的(使用ApacheKafka)。现在我们正在努力实现更复杂的业务需求,我们必须考虑多个事件以创建新的事件和副作用 在目前的情况下,我们正在使用可能产生错误的设备,并且我们已经对它们进行了处理,并且有一个单独的主题,其中包含错误发生和错误解决事件(因此它们是有序的)。我们还确保,关于特定设备的所有消息始终位于同一分区上。这两条消息共享一个标识特定错误事件的ID。我们已经有了一个使用这些事件的投影,并为我们的客户s.t.提供了

我们目前正在一个消息驱动的微服务环境中工作,我们的一些消息/事件是事件源的(使用ApacheKafka)。现在我们正在努力实现更复杂的业务需求,我们必须考虑多个事件以创建新的事件和副作用

在目前的情况下,我们正在使用可能产生错误的设备,并且我们已经对它们进行了处理,并且有一个单独的主题,其中包含错误发生和错误解决事件(因此它们是有序的)。我们还确保,关于特定设备的所有消息始终位于同一分区上。这两条消息共享一个标识特定错误事件的ID。我们已经有了一个使用这些事件的投影,并为我们的客户s.t.提供了一个API。他们可以看到所有发生的错误及其当前状态

现在我们必须处理以下要求:

报告错误 我们需要一个推送系统,可以向外部合作伙伴报告设备错误,但只能在15分钟后,如果在该时间段内没有解决问题,就必须这样做。我们的第一种方法是使用所有已解决的错误事件,存储ID,并让另一个使用者以延迟方式处理已发生的错误事件(例如,如果主题的时间戳至少为15分钟,则仅使用该主题上的下一个已发生错误事件)。然后,我们将能够知道该特定错误是否已经解决,并且不需要报告(因为它们与相应的错误解决事件共享一个公共ID)。否则,我们将向外部合作伙伴发送HTTP请求,并在新主题上创建错误报告事件是否有更好的延迟和有条件消息处理方法?

我们还必须考虑以下特殊用例:

  • 服务重新启动:目前我们计划将已解决错误的列表保留在内存中,因此,如果服务重新启动,则必须从头开始创建该列表。我们可以重播已解决错误的消息,但这可能需要一些时间,在此期间不应处理任何已发生错误的事件,因为这可能会导致报告在不到15分钟内已解决的错误,但我们只是没有意识到这一点重播与“正常”处理之间有什么好的做法吗?
  • 缩放:我们可以随时增加或减少服务实例的数量,因此分区分配可能在运行时发生变化。如果我们在使用ERROR_RESOLVED events,s.t.时为每个服务实例创建一个使用者组,那么这应该不是问题。每个实例都知道所有已解决的错误,但仍然只处理其分配分区(在另一个由所有实例共享的使用者组中)的ERROR_events有更好的方法处理分区重新分配和内部状态吗?

提前谢谢

对于副作用,我会在事件存储中记录所有“副作用”。在您的特定示例中,当需要发送通知时,我将调用send_notification命令来发出notification_SENT事件。这些事件将由执行实际HTTP请求的某个工作进程处理

实际上,我会更详细地阐述这一点,因为通知可能会失败,所以我会,比如说,有两个事件需要通知,并发送取消通知,这样我们就可以重试失败的通知


最后,您的逻辑是“如果错误未在15分钟内解决,并且通知未发送-发送通知(如果错过了时间段,则仅放弃通知)”

寻求调试帮助(“此代码为什么不工作?”)的问题必须包括所需的行为,一个特定的问题或错误,以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:。