Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 了解发布子消息是否成功的模式_Design Patterns_Publish Subscribe_Amazon Sqs_Amazon Sns_Microservices - Fatal编程技术网

Design patterns 了解发布子消息是否成功的模式

Design patterns 了解发布子消息是否成功的模式,design-patterns,publish-subscribe,amazon-sqs,amazon-sns,microservices,Design Patterns,Publish Subscribe,Amazon Sqs,Amazon Sns,Microservices,我正在为一个项目开发微服务,我们正在试验使用AWS SNS+SQS的酒吧间通信。我们不确定如何向服务发出信号,告知其他服务是否已成功完成任务。 例如,如果服务A发出SNS事件,并且服务D、E和F都在侦听订阅的SQS队列,那么服务A如何知道服务D、E和F中的服务A启动的活动是否成功 我将给出一个更具体的例子: 新用户注册网站。此网络呼叫首先到达后端的用户服务。如果用户成功,它将发送一个事件,说明创建了一个新用户。这将触发电子邮件服务向用户发送电子邮件以确认其注册。如果它无法发送电子邮件,会发生什么

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

我将给出一个更具体的例子: 新用户注册网站。此网络呼叫首先到达后端的
用户服务
。如果用户成功,它将发送一个事件,说明创建了一个新用户。这将触发
电子邮件服务
向用户发送电子邮件以确认其注册。如果它无法发送电子邮件,会发生什么情况? 拥有
用户服务

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

2) 还是在等待确认?什么是确认的好酒吧子模式


我知道我们可以做一个同步调用,但是为了简洁起见,这个例子被简化了

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

但是,出版商有责任确保订阅者收到这些活动

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

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

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

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


唯一真正做到这一点的方法是实现某种工具,它允许您跟踪从一个地方到另一个地方发布的事件中编码的“对话”。有一些工具可用于此目的(我只使用了一个,用于调用的NServicebus)。

如果您已经开始使用事件,为什么不继续使用它们?让服务发布原始服务侦听的确认事件。@dbugger如果它正在等待队列中的一切成功,这是否意味着
服务a
正在等待同一个线程,而前端也在等待
服务a
的响应?这取决于您,但我不想让前端等待。向前端响应已收到的请求。让服务等待其响应。当它收到确认时,它可以将确认发送到前端。如果它在超时时间内没有收到它们,它可以a)重试,或者b)告诉前端有错误。明白了。关于b),如果前端用户已经收到一条成功消息(尽管这并不确定),并且用户移动到另一个屏幕,那么前端如何侦听电子邮件未能发送的可能消息?使用SNS或推送消息服务?实际上,ServicePulse将提供监视以查看消息是否失败:)@TomRedfern您是否能够将ack发送回发布服务器或仅发送回消息代理软件(如RabbitMQ)?我现在了解到,如果消息成功,您将从队列中删除消息,这是确保消息成功的方法已处理,但我仍很好奇是否可以向发布者确认消息成功。@NateW-并非总是可以-某些消息传递协议(如amqp和mtqp)支持双工通信模式。IIRC rabbit只是用erlang编写的amqp的一个实现。许多消息传递平台都不支持这两种协议,只是哑管道。对于这样的平台,这种能力需要建立在上面。