一,消息队列基本概念
借用百科的一句话:消息队列就是在消息的传输过程中,保存消息的容器。
从图-1和图-2对比,可以很清晰的明白,消息队列服务器,是位于应用服务器和数据库服务器之间的一个服务器。消息队列服务器作为一个缓冲,接收应用服务器发送过来的数据库操作命令,然后按照自己的配置,依次发送给数据库服务器来执行。这种数据库执行的方式,我们称之为异步写入数据库。增加消息队列服务器有以下几点好处:
1,由于消息队列服务器的速度远远高于数据库服务器,所以能够快递处理并返回数据;
2,消息队列服务器具有更好的扩展性;
3,在高并发的情况下,延迟写入数据库,可以有效降低数据库的压力;
凡事都会有利有弊,消息队列也不例外。正所谓知己知彼,百战不怠,我们要想把消息队列用的炉火纯青,消息队列的“弊端”也要铭记于心:
1,由于消息队列是在写入消息队列服务器之后,马上返回给用户,此时数据并没有真正的写入到数据库,后续的数据库操作可能会执行失败,这显然是有问题的。我们一般的做法,是通过业务的手段来解决异步带来的不一致问题。比如我们可以稍微修改一下业务流程,在订单写入消息队列后,不立即返回订单生成成功,而是等待消息队列里的进程真正的执行完以后,再通知用户订单生成成功。
消息队列有特殊的应用场景,而作为我们程序猿或者架构师,就是要从中进行取舍,拿出一套权衡利弊之后的解决方案,解决项目中遇到的问题。
典型应用:活动期间,短时间内生成大批量的订单。如图-3
消息队列的应用场景:邮件服务、短信服务、好友动态推送服务等。我们必须要明白一点:任何需要持久化的产品,磁盘IO都是一个逃不掉的限制。消息队列只是在时间上延长了持久化的时间。
二,消息队列的具体实现(消息队列在项目中的应用)
消息队列的实现方式有很多种,
1,借助nosql数据库或者Memcached实现消息队列;
2,HornetQ、Apache 的 ActiveMQ、Beansalkd、RabitMQ、IronMQ、Tibco EMS、IBM的MQSeries等等;
首先我们来看看:Apache ActiveMQ
Apache ActiveMQ是Apache软件基金会所研发的开放源码消息中间件;由于ActiveMQ是一个纯java的,所以只要操作系统支援Java虚拟机(JVM),ActiveMQ便可运行。
说到这里,我们需要了解一下JMS与ActiveMQ的关系:
1,JMS,即Java Message Service ,也就是大名鼎鼎的java消息服务API,是一个规范;
2,ActiveMQ,是JMS规范的一种实现;