我对微服务的架构有一个相当理论的问题。
假设我们有两个微服务A
和B
通过RabbitMQ相互交互。当A
有问题时,它会向queue_1
发送消息,并通过B
从queue_2
收到答案(通信可以保持异步)。
------------
---> queue_1 --->
A ------------ B
------------
<--- queue_2 <---
------------
现在我知道A
可以提出至少4种不同类型的问题。我的问题是配置它的最佳方法是什么?
是否可以为每种问题创建一个单独的队列对(因此它们不是混合的,它更容易确定,期望什么样的答案)?
或者它被认为不是非常优化,最好为所有消息创建一个通道并将它们路由到微服务中?
我会感谢有关此主题的任何链接和信息。
答案 0 :(得分:1)
没有简单的答案;建筑师的工作是彻底分析真实场景并确定合适的结构。
让我们说请求类型是W,X,Y和Z.为简单起见,我们假设每个队列有一个消费者。 如果W和X快速处理,而Y和Z是冗长的操作,那么在一个队列中拥有所有内容意味着一旦你在队列的顶部有一个Y或Z,那么任何排队的W和X将花费大量的时间排队,等待消费者完成漫长的过程。在这种情况下,最好为Ws和Xs设置一个队列,为Ys和Zs设置另一个队列。
想想现实生活中的排队服务吧,比方说超市吧。你有正常的通道到收银员,你有那些&#34;多达10个产品&#34;快车道。
需要考虑的另一件事是:您是否希望将不同的策略和保证应用于每种请求类型?例如,可能是Ws是&#34;记录消息&#34;每隔一段时间就会到达,你不能丢失(需要持久保存到磁盘),并且无论何时发送它们都必须进行处理(没有&#34;生存时间&#34;),而Xs是&#34;事件消息&#34;一直到达,必须快速处理,并且只有几秒钟(TTL很短)。这意味着他们需要不同的队列。
也许Ys和Zs有不同的优先级:也许你必须尽快处理Zs,即使有待处理的Y.这将再次要求不同的队列。
如果所有请求类型的重要性等等,那么为了简单起见,单个队列可能会更好。
同样的讨论针对响应队列。您可以有四个不同的请求队列和一个响应队列。或者四个响应队列,或两个......(它不必是对称的)。
还有其他问题需要考虑,例如安全性,可伸缩性和性能。
实际的路由不是真正的挑战,并且可以通过使用消息头(您不必检查实际的消息体以确定其类型)来轻松地帮助确定哪个处理程序应该处理每种消息类型,这是真的就像拥有不同的队列一样简单。