目录
1、JMS消息服务和使用场景
什么是JMS: Java消息服务(Java Message Service),Java平台中关于面向消息中间件的接口
JMS是一种与厂商无关的 API,用来访问消息收发系统消息,它类似于JDBC(Java Database Connectivity)。这里,JDBC 是可以用来访问许多不同关系数据库的 API
使用场景:
核心应用
解耦:订单系统-》物流系统
异步:用户注册-》发送邮件,初始化信息
削峰:秒杀、日志处理
跨平台 、多语言
分布式事务、最终一致性
RPC调用上下游对接,数据源变动->通知下属
2、消息中间件常见概念和编程模型
常见概念
JMS提供者:连接面向消息中间件的,JMS接口的一个实现,RocketMQ,ActiveMQ,Kafka等等
JMS生产者(Message Producer):生产消息的服务
JMS消费者(Message Consumer):消费消息的服务
JMS消息:数据对象
JMS队列:存储待消费消息的区域
JMS主题:一种支持发送消息给多个订阅者的机制(某一个主题)
JMS消息通常有两种类型:点对点(Point-to-Point) 只能消费一次、发布/订阅(Publish/Subscribe)
基础编程模型
MQ中需要用的一些类
ConnectionFactory :连接工厂,JMS 用它创建连接
Connection :JMS 客户端到JMS Provider 的连接
Session: 一个发送或接收消息的线程
Destination :消息的目的地;消息发送给谁.
MessageConsumer / MessageProducer: 消息消费者,消息生产者
3、主流消息队列和技术选型
Apache ActiveMQ、Kafka、RabbitMQ、RocketMQ
ActiveMQ:http://activemq.apache.org/
Apache出品,历史悠久,支持多种语言的客户端和协议,支持多种语言Java, .NET, C++ 等,基于JMS Provider的实现
缺点:吞吐量不高,多队列的时候性能下降,存在消息丢失的情况,比较少大规模使用
Kafka:http://kafka.apache.org/
是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理大规模的网站中的所有动作流数据(网页浏览,搜索和其他用户的行动,大数据中用的广,采集用户的行为,将信息存到消息队列中进行暂存),副本集机制,实现数据冗余,保障数据尽量不丢失;支持多个生产者和消费者
缺点:不支持批量和广播消息,运维难度大,文档比较少, 需要掌握Scala
RabbitMQ:http://www.rabbitmq.com/
是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不错
缺点:使用Erlang开发,阅读和修改源码难度大
RocketMQ:http://rocketmq.apache.org/
阿里开源的一款的消息中间件, 纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点, 性能强劲(零拷贝技术),支持海量堆积, 支持指定次数和时间间隔的失败消息重发,支持consumer端tag过滤、延迟消息等,在阿里内部进行大规模使用,适合在电商,互联网金融等领域使用
4、阿里巴巴开源RocketMQ4.x消息队列介绍
Apache RocketMQ作为阿里开源的一款高性能、高吞吐量的分布式消息中间件
特点
支持Broker和Consumer端消息过滤
支持发布订阅模型,和点对点,
支持拉pull和推push两种消息模式
单一队列百万消息、亿级消息堆积
支持单master节点,多master节点,多master多slave节点
任意一点都是高可用,水平拓展,Producer、Consumer、队列都可以分布式
消息失败重试机制、支持特定level的定时消息
新版本底层采用Netty
4.3.x支持分布式事务
适合金融类业务,高可用性跟踪和审计功能。
概念
Producer:消息生产者
Producer Group:消息生产者组,发送同类消息的一个消息生产组
Consumer:消费者
Consumer Group:消费同类消息的多个实例
Tag:标签,子主题(二级分类)对topic的进一步细化,用于区分同一个主题下的不同业务的消息
Topic:主题, 如订单类消息,queue是消息的物理管理单位,而topic是逻辑管理单位。一个topic下可以有多个queue,默认自动创建是4个,手动创建是8个
Message:消息,每个message必须指定一个topic
Broker:MQ程序,接收生产的消息,提供给消费者消费的程序
Name Server:给生产和消费者提供路由信息,提供轻量级的服务发现、路由、元数据信息,可以多个部署,互相独立(比zookeeper更轻量)
Offset: 偏移量,可以理解为消息进度
commit log: 消息存储会写在Commit log文件里面
走读官网地址,学会如何学习新技术 http://rocketmq.apache.org/
学习资源
http://jm.taobao.org/2017/01/12/rocketmq-quick-start-in-10-minutes/
https://www.jianshu.com/p/453c6e7ff81c
5、RocketMQ4.x本地快速部署
安装前提条件(推荐) 64bit OS, Linux/Unix/Mac (Windows不兼容) 64bit JDK 1.8+;
快速开始 http://rocketmq.apache.org/docs/quick-start/
下载安装包:http://mirror.bit.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-source-release.zip
通过源码的方式进行下载:
unzip rocketmq-all-4.4.0-source-release.zip
cd rocketmq-all-4.4.0/
//下载该项目所有的依赖包
mvn -Prelease-all -DskipTests clean install -U
cd distribution/target/apache-rocketmq
最终路径 rocketmq-all-4.4.0/distribution/target/apache-rocketmq
在解压时没有unzip命令
安装unzip
yum install -y unzip zip
最新版本部署存在问题:
Please set the JAVA_HOME variable in your environment, We need java(x64)
解决:本地需要配置 JAVA_HOME 使用命令 vim ~/.bash_profile
JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home"
export JAVA_HOME
CLASS_PATH="$JAVA_HOME/lib"
PATH=".$PATH:$JAVA_HOME/bin"
解压压缩包
启动nameServer
nohup sh bin/mqnamesrv &
查看日志 tail -f nohup.out (结尾:The Name Server boot success. serializeType=JSON 表示启动成功)
启动broker (-n指定nameserver地址,nameserver服务端口为9876, broker默认端口 10911)
nohup sh bin/mqbroker -n localhost:9876 &
关闭nameserver broker执行的命令
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv (服务发现)
使用 jps查看进程
验证是否成功
#设置名称服务地址
export NAMESRV_ADDR=localhost:9876
#投递消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
SendResult [sendStatus=SEND_OK, msgId= ...
#消费消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
ConsumeMessageThread_%d Receive New Messages: [MessageExt...
内存不足的问题解决方法
修改默认的配置文件:rocketmq的默认的runserver.sh 和runbroker.sh。需要修改默认的配。
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
3.x
export rocketmq=/usr/local/software/rocketmq-all-4.4.0/distribution/target/apache-rocketmq
export PATH=$PATH:$rocketmq/bin
ROCKET_HOME=/usr/local/software/rocketmq-all-4.4.0/distribution/target/apache-rocketmq