【发布时间】:2017-09-08 15:50:49
【问题描述】:
在回答我的问题之前,让我勾勒出一组微服务示例来说明我的困境。
场景大纲
假设我有 4 个微服务:
一项激活服务,提供给我们客户的功能被(停用)激活。可以添加和更改成员的注册服务。一种安全密钥服务,能够生成安全密钥(在一个多步骤过程中),供成员在与外界通信时使用。以及用于与外部供应商就我们的会员进行交流的通信服务。
安全密钥服务可能仅在此功能被激活时才请求安全密钥。此外,通信服务只能与拥有安全密钥的成员进行通信,并且通信功能本身是否已激活。
因为它们是微服务,所以每个服务都有自己的数据存储并且完全自给自足。也就是说,其他微服务所需的任何数据都在本地复制,并通过来自其他微服务的异步消息保持同步。
困境
我实际上面临两个主要困境。首先是(很明显)数据同步。当有多个数据存储需要保持同步时,您必须考虑消息丢失或无序处理。但是有很多开箱即用的解决方案可以解决这个问题,当所有解决方案都失败时,您甚至可以退回到某种 ETL 流程来保持同步。
然而,我面临的主要问题是需要执行的操作。在上面的例子中,安全密钥服务必须执行一个动作,当它要么
- 当新成员知道安全密钥功能在激活服务中处于活动状态时,会收到来自注册服务的消息
- 收到来自激活服务的消息,当它已经知道来自注册服务的成员时,安全密钥功能现在处于活动状态
在这两种情况下,这意味着来自外部系统的消息必须导致本地数据副本的更新以及需要处理的一些逻辑。
问题
现在是实际问题:)
在处理这些消息时,应对错误或新见解的推荐方法是什么?假设 激活服务 的消息处理程序中存在错误。处理程序确实更新了内部数据结构,但它未能检测到已经注册的成员,因此永远不会启动 安全密钥生成 过程。或者,可能是没有错误,但我们认为我们希望处理程序执行其他操作。
系统将没有理由重新提交或重新处理消息(因为消息没有失败),但我们没有真正的方法来重新触发消息背后的行为。
我希望我的要求很清楚(如果它应该发布在其他 170 个 Stack... 网站中的任何一个上,我深表歉意,我只知道 StackOverflow)
【问题讨论】:
标签: asynchronous message-queue microservices