一.消息中间件
1.概念
关注于数据的发送和接受,利用高效可靠的异步消息传递机制集成分布式系统。
2.为什么使用
- 业务解耦,代码解耦:例如,订单业务需要发送短信、推送app通知信息、扣除会员积分、发送email等,如果把这些全部写在订单业务代码中,订单代码将会变得十分臃肿,不利于修改维护,事物管理十分麻烦,使用中间件就不会有上述问题
- 同步变异步,加快业务响应时间,相对于RPC来说,异步通信使得生产者和消费者得以充分执行自己的逻辑而无需等待
- 流量消峰,消息存储堆积也是消息中间件的核心,可堆积大量的消息,当上游系统的吞吐能力远高于下游系统,在流量洪峰时可能会冲垮下游系统,消息中间件可以在峰值时堆积消息,而在峰值过去后下游系统慢慢消费消息解决流量洪峰的问题,典型的场景就是秒杀系统的设计。
- 消息的顺序性,消息中间件采用的是队列技术,消息队列可以保证消息的先进先出,能保证消息顺序执行。
- 消息的可靠性,消息中间件有消费确认机制(ACK),在收到成功被消费的确认消息之后才会把消息从队列中删除,并且消息中间件有本地刷盘存储功能。
解决分布式事物复杂性。
使用消息中间件前后对比:
上述未使用消息中间件,所有跟订单相关的业务全部放在订单服务中处理,订单服务臃肿繁琐。
使用消息中间件后,订单服务只需处理订单业务,其他相关的业务异步推送到消息中间件即可。
3.主要消息中间件的对比
主推Kafka
二.kafka
1.安装
官方下载安装包后,上传到Linux系统上,解压到opt
1.修改配置文件
cd /opt/kafka/config
vi server.properties
# The id of the broker. 集群中每个节点的唯一标识(第21行)
broker.id=0
# 监听地址(第36行)
advertised.listeners=PLAINTEXT://192.168.195.20:9092
# 数据的日志存储位置(第60行)
log.dirs=/opt/kafka/kafka-logs
# Zookeeper连接地址(第123行),如果是集群,写完所有的连接ip
zookeeper.connect=192.168.195.20:2181
# 末行新增如下内容,作用:删除topic的配置,否则kafka不让删除topic
#默认是false,只是标记删除,不会真的删除,
delete.topic.enable=true
这里需要说明的是 log.dirs 指的是数据日志的存储位置,确切的说,就是分区数据的存储位置,而不是程序运行日志的位置。程序运行日志的位置是通过同一目录下的 log4j.properties 进行配置的。
2.配置环境变量
export KAFKA_HOME=/opt/kafka
export PATH=$PATH:$KAFKA_HOME/bin
3.运行
首先要启动zookeeper,zkServer.sh start
在启动kafka,[root@hadoop20 config]# kafka-server-start.sh
后台启动命令:[root@hadoop20 config]# kafka-server-start.sh -daemon ./server.properties
这里是在config的目录i下启动,如果觉得麻烦,可以用软连接来操作(任何目录下都可以启动)
[root@hadoop20 /]# ln -s /opt/kafka/config/server.properties /opt/server.properties
[root@hadoop20 /]# kafka-server-start.sh -daemon /opt/server.properties
启动成功后,可以通过jps来查看是否启动成功,如果有kafka节点代表OK
2.名词解释:
3.操作
3.1创建topic
kafka-topics.sh --create --zookeeper 192.168.195.20:2181 --topic kb09demo
3.2创建五个分区
kafka-topics.sh --create --zookeeper 192.168.195.20:2181 --topic kb09demo2 --partitions 5 --replication-factor 1
结果如下:(分区数是5,factor副本为1,不能大于broker数量,即不能大于节点数)
3.3查看topic详情
kafka-topics.sh --zookeeper 192.168.195.20:2181 --topic kb09demo --describe
3.4查看所有的topic列表
kafka-topics.sh --zookeeper 192.168.195.20:2181 --list _consumer_offsets
3.5删除topic
kafka-topics.sh --delete --topic kb09demo --zookeeper 192.168.195.20:2181
3.6查看消息队列
kafka-run-class.sh kafka.tools.GetOffsetShell --broker-st 192.168.195.20:9092
--topic kb09two -time -1 --offsets 1
3.7两个窗口连接测试操作
producer窗口1
kafka-console-producer.sh --topic kb09demo2 --broker-list 192.168.195.20:9092
consumer窗口2
kafka-console-consumer.sh --topic kb09demo2 --bootstrap-server 192.168.195.20:9092 --from-beginning