转载自http://blog.csdn.net/tenfyguo/article/details/7453355
在系统架构设计中,我们有时会用到消息队列,但对对应为什么需要用到消息队列,消息队列的引入是否对架构设计有更多的好处方面,我们是否有足够的认识?
是否存在为了用消息队列而引入呢?所以这里我们需要非常明确我们的架构目标,一般来说,消息队列能够提供以下几个方面的帮助:
1,保证消息的传递;
如果发送消息时接收者不可用,消息队列会保留消息,直到成功地传递它;
2,提供异步的通信协议;
消息的发送者将消息发送到消息队列后可以立即返回,不用等待接收者的响应,消息会被保存在队列中,直到接收者取出它;
3,解耦;
只要消息格式不变,即使接收者的接口、位置、或者配置改变,也不会给发送者带来任何改变;
而且,消息发送者无需知道消息接收者是谁,使得系统设计更清晰;
相反的,例如,远程过程调用(RPC)或者服务间通过socket建立连接,如果对方接口改变了或者对方ip、端口改变了,那么另一方需要改写代码或者改写配置;
4,提供路由;
发送者无需与接收者建立连接,双方通过消息队列保证消息能够从发送者路由到接收者,甚至对于本来相互网络不通的两个服务,也可以提供消息路由。
细节方面的关注:
1,支持并发模式和顺序模式
顺序模式:
消息接收后,在消息接收者来主动删除这条消息之前,队列中的其他消息不可被接收。这样保证应用在一个任务完成后再处理下一个任务,提供了强顺序性
并发模式:
消息被接收后,消息接收者主动删除前,队列的下一个消息仍可被其他应用接收,且可以一直并发获取下一个没有被接收的消息。
如果消息被接收后持久(该时间可配)不被删除,则认为消息的原接收者处理失败,消息重新可见,
可被其他应用再次接收(此特性为容错处理,“接收顺序队列消息”的功能也具备该特性)。
2,短暂锁模式:
一个消息不会同时被多个服务接收,这是通过针对消息的短暂锁来保证的,消息的接收者可以指定消息被锁定的时间,
如果接收者处理完消息需要主动将消息显示删除,如果接收者处理消息失败了,那么另一个服务可以在这个消息的锁失效后重新获得这个消息。