首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排队时怎么办?

排队时怎么办?
EN

Stack Overflow用户
提问于 2018-01-11 14:37:13
回答 4查看 1.9K关注 0票数 4

我有两个微服务,AB。当A收到来自用户的请求时,它会被处理(将一些东西存储在数据库中),并将消息发送到由B读取的队列中。

如果队列关闭,我最初的想法是使整个请求崩溃、回滚,并向请求稍后再试的用户显示一个错误。这是个糟糕的做法吗?

是否更好的做法是将消息存储在标记为ANOT_SENT数据库中,然后在队列再次出现时再发送消息?还是过于工程化了?

编辑:对A的请求需要是同步的,所以用户知道它的结果,但是不需要知道处理消息的B的结果,所以它可以是异步的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-01-11 15:55:08

在数据库中创建冗余队列。如果队列不可靠,可以创建其中的几个,但是使用数据库设计自己的队列是重复的工作。如果确实需要两个队列来进行冗余,请创建两个队列。它可以作为医院队列加倍,因为很可能需要处理主队列中的处理失败(具有相同的重试语义)。

票数 2
EN

Stack Overflow用户

发布于 2018-01-11 15:48:04

是的,这取决于您的操作是原子操作(因此用户需要立即反馈),还是只需要后台处理作业,正如Nicolas所指出的。我只想补充一点,您可能会考虑实现一个断路器模式,在向用户报告故障之前重新尝试几次,或者根据您的需求将消息作为NOT_SENT保存。

票数 1
EN

Stack Overflow用户

发布于 2018-01-11 21:31:19

我有两个微服务,另一个是A和B。当A接收到用户的请求时,它会被处理(将一些东西存储在数据库中),并将一条消息发送到一个队列,由B读取。

好的。让我们假设一些东西被处理并保存到数据库=产生了一些副作用。

如果队列关闭,我最初的想法是使整个请求崩溃,并向请求稍后再试的用户显示一个错误。这是个糟糕的做法吗?

但是,您需要撤消第一步(前面讨论过的步骤),然后才会失败客户端的请求!你有两个选择:

  • 包装副作用并在事务中添加队列;这仅适用于可撤销的副作用(即,除非文件被移到垃圾中,否则删除文件是不可撤销的)。当第一步必须同步处理时,应使用此解决方案。
  • 还将请求添加到队列中并在稍后进行处理,第一个异步步骤是microservice A。如果添加到队列失败,则请求失败。此解决方案比第一种解决方案更具可伸缩性。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48209566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档