有人可以提供一些关于何时使用消息队列以及他们应该解决哪些实际问题的经验法则吗?
谢谢
异步消息传递允许系统以断开连接的方式进行通信。两个系统不必同时可用以完成工作。
还有其他好处。消息传递通常提供(有时是无意的)限制机制。如果许多请求同时进入,这可以防止接收系统变得不堪重负。
许多消息传递系统还提供持久性和可靠性设施,保证消息最终将被传递,即使消息传递平台或接收系统崩溃。
消息队列还提供了一层间接性。将消息放入队列的系统不一定知道谁(如果有的话)正在接收该消息。接收者可以以微妙或剧烈的方式改变,而完全不影响发送者。像这样的松散耦合通常是可取的。
许多消息传递解决方案也可以参与事务。这确保了系统既可以接收消息又可以更新数据库作为响应,并且知道两者都成功或都不成功。如有必要,消息的接收可以“回滚”并在出现问题时重试。
当您需要一种异步但有保证的方式来在分层环境中处理无状态、面向服务的请求时。
消息队列提供可靠的消息传递。他们确保消息不会完全丢失。它们仍然可以被延迟/发送到死消息队列等,但它们永远不会从系统中完全消失——即使它卡在原始客户端上,也总会有一个副本,除非它被明确删除。
消息队列应该用于消息丢失对业务有害和/或导致系统不稳定的情况。使用它们会产生开销,因此仅应在业务需求指示时实施它们。
在实施它们的情况下,应该有某种监控过程来检查冻结的消息(由于服务关闭、消息格式不正确等而无法处理的消息)并处理它们适当地。
消息队列对于实现负载平衡很有用。例如,服务器接收“工作”消息(订单、状态消息......)并将它们分发给所有正在侦听的客户端。
消息队列保证一条消息将被准确地传递给一个客户端。
如果客户端在不同的计算机上运行,则总负载将被分配,并且在必要时很容易将另一个客户端投入到消息负载中,客户端只需连接到队列并接收(部分)消息。
编辑:
也适用于在系统之间移动对象(异步)。如果它们以独立于平台的格式(JSON、XML)进行序列化,甚至可以在不同的编程语言之间进行交换。