了解发布-订阅消息是否成功的模式

Patterns for knowing if a pub-sub message was successful

我正在为一个项目开发微服务,我们正在试验使用 AWS SNS+SQS 的发布-订阅通信。我们不确定如何向服务发出信号,表明其他服务是否已成功完成任务。
例如,如果服务 A 发出 SNS 事件并且服务 D、E 和 F 都在监听订阅的 SQS 队列,服务 A 如何知道服务 A 在服务 D、E 和 F 中启动的活动是否是成功的?

我举一个更具体的例子: 新用户注册网站。此网络调用首先到达后端的 user service。如果用户成功,它会发出一个事件,说明创建了一个新用户。这会触发 email service 向用户发送电子邮件以确认其注册。如果发送电子邮件失败会怎样? 有 user service:

1)已经回复前端说成功了

2) 还是等待确认?什么是用于确认的良好发布-订阅模式?

我知道我们可以只进行同步调用,但为简洁起见简化了此示例。

正如@dbugger 在评论中所说,您可以让订阅者向发布者发送 ack 或其他内容。

但是,发布者有责任确保订阅者收到事件?

发布事件的意义在于发布者不需要(也不应该)知道订阅事件的消费者的状态,订阅者是否忽略了消息,或者即使有没有订阅者。

如果发布者确实需要知道,那么发布者应该以请求-响应模式而不是事件直接向消费​​者发送命令而不是事件。

这是因为命令消息假设收件人知道,而事件消息假设不知道。

就从自上而下的角度了解事件何时到达而言:嗯,您应该使用可以保证事件传递的持久消息传输,但即使具有持久性,您仍然可以丢弃消息。

真正做到这一点的唯一方法是实施某种工具,让您可以跟踪 "conversations" 编码在各地发布的事件中。有可用的工具(我只用过一个,用于 NServicebus,名为 ServicePulse)。