了解为什么您希望在将来处理消息队列

Understanding why you would want to process Message Queues at a future time

所以我想了解队列解决了哪些实际问题。通过阅读Google的所有信息,我得到了高层

所以我正在研究 A 公司的架构,他们有不同的作业队列用例,例如

为什么要稍后处理?

这是我的最佳猜测...

  1. 假设我有一个应用程序可以一次处理 10 "things"。
  2. 然后我的应用程序将其处理能力最大化。
  3. 收到第 11 个请求,因此应用将其放入队列以供稍后处理

假设这是一个有效的用例,添加更多服务器来处理更多 "things" 是否有意义?是不是因为增加更多的服务器比使用一个 Queue 并牺牲一点响应时间成本更高?

根据我的用例示例,队列还可以解决哪些其他问题?

你在银行繁忙的时候排队过吗?你会在队列中等待。

"But," 你可以说,"wouldn't adding more staff to process more customers make sense? Is it because it's more costly to add more staff than employ a Queue and sacrifice response time a little bit?"

没错。根据每天到达的 客户高峰 数量来为银行配备人员的成本可能会很高。低于此级别的员工更便宜,并且有一些客户排队等候。

此外,每天的客户数量并非 100% 可预测。队列允许多余的需求在不破坏系统的情况下等待。

队列启用解耦

例如,想象一下客户购买商品的在线商店。他们 select 商品,提供信用卡号并点击 'Purchase'。如果信用卡被拒绝,在线商店可以立即提示他们重新输入号码。这种互动必须在客户在线时立即进行。

但是,在生成发票、将记录添加到会计系统和下架库存时,无需让客户等待。这可以与订购流程分离。一个好的方法是将订单推入队列,可以由下一个系统处理

如果 'next system' 恰好此时离线,没有理由取消整个销售。当 'next system' 重新上线时可以处理交易。这比仅仅因为一个组件(不是立即需要的)出现故障而导致整个过程失败要好得多。

底线:队列优秀。它们可以更好地处理故障。它们使事情更有弹性(只需等待几分钟,然后重试!)。当进程与队列架构兼容时,应始终使用它们。

让我们做场景

场景一无队列:

  • 您请求端点 /blabla/do-eveything/
  • 这个请求做

    1. 从非常慢的位置下载图像 FTP 例如 1.5 秒(可以出错,重试?添加 +X 秒)

    2. 将图像附加到电子邮件

    3. 发送电子邮件(3 秒) 例如 1 秒(是否会出错,重试?添加 +X 秒)

    4. 已收到确认 > 将确认存储到第三方公司跟踪资料 例如 1.5(是否会出错,重试?添加 +X 秒)

    5. 当追踪确认后,从另一家第三方公司更新您的数据以用于大数据目的 例如 2 秒(可以出错,重试?添加 +X 秒)

    6. ...你明白了

    7. return 响应,例如 11 秒后(这会变慢)或更多,或者一切都失败时超时

最终用户说 20 年前互联网速度更快,也许我需要更改互联网连接或更改我的 16 个线程


场景 2 尽你所能排队:

  • 您请求端点 /blabla/do-eveything/
  • 这个请求做

    1. 队列作业"DO_EVERYTHING" 例如 0.02 秒

    2. Return 响应小于 0.250 秒

最终用户说 website/app 太快了,我可以保持 56K 的互联网连接

on queue/event 系统一个失败的作业可以稍后重试而不影响最终用户 您可以暂停作业,在原始消息后添加不限数量的 task/step 更好的容错能力


使用队列将使您获得更好的 micro/nano 服务架构,更好的测试,因为您可以测试单个作业,而不是一个做所有事情的完整控制器...

是啊,也许是工作多了,思考多了,但是放假的时候不用再想工作了