思考方式:以辩证的思维去发现探讨新事务
一、JMS消息服务介绍和使用场景
1、讲解什么是JMS,消息队列的使用
①、什么是JMS,java消息队列(java Message Service),java平台中关于面向西澳西中间件的接口。
②、JMS是一种与厂商无关的API,用来访问消息收发系统消息,它类似于JDBC(java Database Connectivity).这里,JDBC是可以用来访问许多不同关系数据库的API.
③、使用常见:
核心应用:
解耦:订单系统 -->物流系统
异步:用户注册--》发送邮件,初始化信息
比如:
上面的步骤需要花600ms,串行的操作,用户需要等600ms才可以返回
1、用户注册保留信息到数据库db中需要100ms
2、写一个事件开一个异步的线程发送了短信,写道消息队列,也就几十毫秒而已
3、短信服务会监听消息中间件里的事件,然后消费。这样就可以进行解耦的操作,短 信服务可以慢慢的消费,而不用管用户推送的消息有多么的多,因为都是放到中间件里 面去了。
150ms:并行,解耦,用户就可以完成注册的操作。
削峰:秒杀,日志处理(spark,storm,elk,kafka,hadoop)
跨平台,多语言
分布式事务,最终一致性:RocketMQ
RPC调用上下游服务,数据源变动->通知下属
二、消息中间件常见概念和编程模型
不同的消息队列有不同的概念,可能不同的中间件有交集,也有的中间件也有特有的。
常见概念:
①、JMS提供者:连接面向消息中间件的,JMS接口的一个实现,RocketMQ,ActiveMQ,kafka等
②、 JMS生产者(Message Producer):生产消息的服务,比如用户注册的时候会产生一个消息,写到消息中间件里面去,所以它就是一个生产者。
③、 JMS消费者(Message Consumer):消费消息的服务,类似于短信服务。有对应的事件,有消息过来,就会进行相应的消费。
④、 JMS消息:数据对象,比如msgid,content,phone,create_time,code
还有元数据里面的信息
⑤、 JMS队列:存储消费消息的区域,链表,list,arraylist,linkedlist,消息都是先进先出,消息中间件里面有很多队列,队列里面有很多的消息。
⑥、 JMS主题:一种支持发送消息给多个订阅者的机制。
user_register_topic:对列的名称
⑦、JMS消息通常有两种类型:点对点(Point-to-Point),发布/订阅(Publish/Subscribe)
基础编程模型:消息中间件的基础模型
①、MQ中需要用的一些类
ConnectionFactory:连接工厂,JMS用它创建连接
Connection:JMS客户都安到JMS Provider的连接
Session:一个发送或接收消息的线程
Destination:消息的目的地:消息发送给谁
MessageConsumer/MessageProducer:消息消费者,消息生产者
三、对比当下主流的消息队列和选择问题
1、Apache ActiveMQ,kafka,RabbitMQ,RocketMQ等等
①、ActiveMQ:http://activemq.apache.org/
Apache出品,历史悠久,支持多种语言的客户端和协议,支持多种语言java,.NET,C++等,基于JMS Provider的实现,和java Provider Web实现的是一模一样的的
缺点:吞吐量不高(据说是万级的),多队列的时候性能下降,存在消息丢失的情况,比较少大规模使用。
②、 Kafka:http://kafka.apache.org/:主要在大数据领域用的很广。
是由Apache软件基金会开发的一个开源流处理平台,由Scala和java编写,kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理大规模的网站中的所有动作流数据(网页浏览,搜索和其他用户的行动),副本集机制,实现数据冗余,保障数据尽量不丢失;支持多个生产者和消费者。
缺点:不支持批量和广播消息,运维难度大,文档比较少。
③、 RabbitMQ:http://www.rabbitmq.com/
是一个开源的AMQP实现,服务端用Erlang语言编写,支持多种客户端,如:python,ruby,.net,java,JMS,C,用于在分布式系统中存储转发消息,在易用性,扩展性 ,
高可用性等方面表现不错。在互联网的电商和金融界用的比较多。
缺点:使用Erlang开发,阅读和修改源码难度大。为了时间和人力的成本。
④、 RocketMQ:http://rocketmq.apache.org/
阿里开源的一款的消息中间件,纯java开发,具有高吞吐量 ,高可用性,适合大规模分布式系统应用的特点,性能强劲(零拷贝技术),支持海量堆积,支持指定次数和时间间隔的失败消息重发,支持consumer端tag过滤,延迟消息等,在阿里内部进行大规模使用,适合在电商,互联网金融等领域使用。