消息队列
2种模式
- 点对点:consumer主动对queue监控,检查是否收到消息
- 订阅模式:Queue主动推送,consumer收到消息后决定是否去Queue里pull(类似微信公众号的文章推送)
优点:
- 解耦(通过中间件通信)
- 冗余:可做缓存
- 扩展性
- 顺序保证
- 异步通信:consumer即使down掉,消息还是保存在Queue,等consumer恢复会自动处理消息
RabbitMQ
关于Broker里的Exchange不可以直接将消息发给Queue,必须由他进行过滤,
Exchange 的四种模式:
1. direct 模式 : 直接将消息转发到消息的 routing key 所指定的消息队列中,match不到直接丢弃
2. fanout 模式:常用的发布/订阅模式,类似公众号推送文章,每个queue都可以处理
3. topic模式:把收到的消息转发到所有关心 routing-key 的 queue 上,可以模糊匹配,匹配不到直接丢弃
4. header模式:他根据消息 header 中的 “x-match” 属性匹配已经绑定的消息队列
Queue与consumer:
push模式:消费者定期主动去Queue监控是否由message
消费完之后,Queue中不存储任何消息
Kafka
定义:分布式的消息队列
集群:每个集群都是kafka实例,每个实例叫broker,依赖于zookeeper,多个集群直接可做备份,consumer 消费的是leader topic,数据保存在topic里
配置文件位置:/etc/config/server.properties
- 修改broker.id
- 指定收到数据的位置(在指定位置可以找到创建的topic,在topic里看到000000123.index索引文件和00000123.logshou到的数据)
- 修改集群zookeeper
consumer依赖zookeeper保存meta数据
2个consumer可以同时消费同一个topic里的消息,zookeeper里保存consumer消费进度
- 启动:
在bin目录下可以看到
命令:bin/kafka-server-start.sh -daemon config/server.properties
-daemon:守护进程,可以在后台运行,如果不加-daemon看到的是阻塞进程,关闭connection后Kafka停止运行
- 停止
命令:bin/kafka-server-stop.sh 后面不需要加配置文件,加了也可以
- 查看
查看是Kafka否运行命令:jps
topic
查看topics命令:bin/kafka-topics.sh --zookeeper 10.1.1.1:2181 --list
创建topic命令:bin/kafka-topics.sh --create --zookeeper 10.1.1.1:2181 --topic one --partition 2 --replication-factor 2(副本数)
PS : 此时,如果有3个集群,会在一个broker里存在一个one-0,第二个broker里存在one-1,第三个里one-1和one-0,整个集群2个one-0和one-1, 副本数不可以超过集群数
删除topic命令:bin/kafka-topics.sh --delete --zookeeper 10.1.1.1:2181 --topic one
log位置:server.log
producer
绑定topic命令:bin/kafka-console-producer.sh --broker-list 10.1.1.1:9092 --topic one
> 在此处输入要放入topic里的message
consumer
绑定topic命令:bin/kafka-console-consumer.sh --zookeeper 10.1.1.1:9092 --topic one
PS:当消息被consumer消费后在log中会生成诸多类似consumer-offset-01的偏移量log文件,若多个consumer同时消费一个topic,是按轮询偏移量的方式消费,由zookeeper进行管理
zookeeper
作用:维护一个集群,防止单机故障,同步消息,集群种的leader是由zookeeper决定,/data/version-2中存储的是zookeeper的数据
Kafka API
异步:2个线程,一个主线程,一个send线程