我有两个微服务,A和B。当A收到来自用户的请求时,它会被处理(将一些东西存储在数据库中),并将消息发送到由B读取的队列中。
如果队列关闭,我最初的想法是使整个请求崩溃、回滚,并向请求稍后再试的用户显示一个错误。这是个糟糕的做法吗?
是否更好的做法是将消息存储在标记为A的NOT_SENT数据库中,然后在队列再次出现时再发送消息?还是过于工程化了?
编辑:对A的请求需要是同步的,所以用户知道它的结果,但是不需要知道处理消息的B的结果,所以它可以是异步的。
发布于 2018-01-11 15:55:08
在数据库中创建冗余队列。如果队列不可靠,可以创建其中的几个,但是使用数据库设计自己的队列是重复的工作。如果确实需要两个队列来进行冗余,请创建两个队列。它可以作为医院队列加倍,因为很可能需要处理主队列中的处理失败(具有相同的重试语义)。
发布于 2018-01-11 15:48:04
是的,这取决于您的操作是原子操作(因此用户需要立即反馈),还是只需要后台处理作业,正如Nicolas所指出的。我只想补充一点,您可能会考虑实现一个断路器模式,在向用户报告故障之前重新尝试几次,或者根据您的需求将消息作为NOT_SENT保存。
发布于 2018-01-11 21:31:19
我有两个微服务,另一个是A和B。当A接收到用户的请求时,它会被处理(将一些东西存储在数据库中),并将一条消息发送到一个队列,由B读取。
好的。让我们假设一些东西被处理并保存到数据库=产生了一些副作用。
如果队列关闭,我最初的想法是使整个请求崩溃,并向请求稍后再试的用户显示一个错误。这是个糟糕的做法吗?
但是,您需要撤消第一步(前面讨论过的步骤),然后才会失败客户端的请求!你有两个选择:
https://stackoverflow.com/questions/48209566
复制相似问题