AMQP协议
AMQP协议,跨语言,跨系统,跨平台的协议,Advanced Message Queuing Protocol 一种高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的消息中间件可跨产品,跨语言的消息通信。Erlang中的实现有 RabbitMQ等。
消息队列的优点是:解耦合、异步处理、消除峰值
1、解耦合:
场景:双十一时大量下单,下单后订单系统通知库存系统,等待库存系统响应,但当库存系统出故障之后就会下单失败,这时订单系统和库存系统就是高耦合的。引入消息队列之后,用户下单后,订单系统处理完之后,将消息写入消息队列,返回用户订单下单成功,库存系统订阅下单系统的消息,当有下单系统的消息时库存系统进行库存操作,这就实现了下单系统和库存系统的解耦。
2、异步处理:
场景:用户注册时,一般都是插入数据库注册信息,发送手机短信,发送邮箱消息,但邮箱、短信等成功消息并不是必须的。
传统方式都是串行模式,比如数据库操作需要100ms,发送手机短信50ms,发送邮箱50ms,总计200ms,但引入消息队列后是数据库操作后写入消息队列之后对用户进行响应显示注册成功,然后再发送邮箱和手机短信。这样用户的等待时间大概为100ms(写入消息队列的时间可以忽略不计)。
3、流量削峰:
一般应用到秒杀活动中,如果用户量过大可能会导致服务挂掉,则需要在前端加入消息队列。控制人数,如果加入消息队列的消息数量过多则直接舍弃该消息,返回给用户下单失败,消息队列中的信息则进行后续正常秒杀操作。
消息队列的类型:ActiveMq、RabbitMq、RocketMQ、kafka、ZeroMq 。
各消息中间件对比及选择:
TPS比较 一ZeroMq 最好,RabbitMq 次之, ActiveMq 最差。
持久化消息比较—zeroMq不支持,activeMq和rabbitMq都支持。持久化消息主要是指:MQ down或者MQ所在的服务器down了,消息不会丢失的机制。
可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统、社区—RabbitMq最好,ActiveMq次之,ZeroMq最差。
高并发—从实现语言来看,RabbitMQ最高,原因是它的实现语言是天生具备高并发高可用的erlang语言。
综上所述:RabbitMQ的性能相对来说更好更全面,是消息中间件的首选。