我正在寻找优化当前使用 HTTP/REST 进行内部节点到节点通信的微服务架构。
一种选择是在服务中实现背压功能,(例如)通过将类似 Quasar 的东西集成到堆栈中。这无疑会改善情况。但我看到了一些挑战。一种是,异步客户端线程是瞬态的(在内存中),并且在客户端失败(崩溃)时,这些重试线程将丢失。第二,理论上,如果目标服务器宕机一段时间,客户端最终可能会到达 OOM 尝试重试,因为线程最终是有限的,甚至是 Quasar Fibers。
我知道这有点偏执,但我想知道基于队列的替代方案在非常大的规模上是否更有利。
它仍然可以像 Quasar/fibers 一样异步工作,除了 a) 队列是集中管理的,并且脱离客户端 JVM,b) 队列可以是持久的,因此在客户端和/或目标服务器出现故障时,没有飞行中的消息丢失了。
当然,排队的缺点是有更多的跃点,它会减慢系统的速度。但我认为可能存在一个甜蜜点,即 Quasar ROI 达到峰值,集中且持久的队列对于扩展和 HA 变得更加重要。
我的问题是:
是否讨论过这种权衡?是否有关于使用集中式外部队列/路由器方法进行服务内通信的论文。
TL;博士; 我刚刚意识到我可以将这个问题表述为:
“什么时候适合在微服务架构中使用基于消息总线的服务内通信而不是直接 HTTP。”