消息系统使用场景:
解耦:各系统之间通过消息系统统一交换数据,无须了解彼此的存在
冗余:部分消息系统具有消息持久化功能,可以避免消息处理前丢失
扩展:消息系统是统一的数据接口,系统可独立扩展
可恢复性:系统中部分组件失效并不会影响整个系统,它恢复后仍然可从消息系统中获取并且处理数据
异步通信:在不需要立即处理请求的场景下,可以将请求放入消息系统,等不紧急时候再进行处理
常用消息系统介绍:
RabbitMQ:Erlang编写,支持多协议AMQP,XMPP,SMTP,STOMP。支持负载均衡,数据持久化。支持Peer-to-Peer和发布/订阅模式
Redis:不仅为NoSQL数据库,同时支持MQ功能,可做轻量级队列服务使用。长消息(大于10kb)性能比RabbitMQ差
ZeroMQ:轻量级,不需要单独的消息服务器或中间件,Peer-to-Peer。使用复杂度高
ActiveMQ:JMS实现,Peer-to-Peer,支持持久化,XA事务
Kafka/Jafka:高性能跨语言的分布式发布/订阅消息系统,数据持久化,全分布式,同时支持在线和离线处理
MetaQ/RocketMQ: Java实现,发布/订阅消息系统,支持本地事务和XA分布式事务
Kafka内容概述:
Apache Kafka是一个开源消息系统,有Scala完成;
kafka是一个分布式消息队列:生产者、消费者的功能。它提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现;
kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受者称为Consumer;kafka集群有多个kafka实例组成,每个实例成为broker;
无论是kafka集群,还是producer和consumer都依赖于zookeeper集群保存一些meta信息,以保证系统可用性
优点:
1,高吞吐率:在廉价的商用机器上单机可支持每秒100万条消息的读写
2,消息持久化: 所有消息均被持久化到磁盘,无消息丢失,支持消息重放
3,完全分布式:Producer,Broker,Consumer均支持水平扩展
4,同时满足适应在线流处理和离线批处理
核心组件:
Producer:生产者,发送消息的人
Consumer:消费者,消息接收的人
broker:kafka实例
Topic:
同一个Topic的消息可分布在一个或多个节点(Broker)上
一个Topic可以包含一个或多个Partition
每条消息仅属于一个Topic
Producer发布数据时,必须指定将数据发布到哪一个Topic上
Consumer订阅消息时,必须指定订阅哪个Topic的消息
Partition
一个Partition只分布于一个Broker上
一个Partition对应一个文件夹
一个Partition包含多个Segment
一个Segment对应一个文件
Segment由一个个不可变记录组成
记录只会被append到Segment中,不会被单独删除或修改
清除过期日志时,直接删除一个或者多个Segment