ActiveMQ | RabbitMQ | Kafka | |
---|---|---|---|
所属社区 | Apache | Mozilla Public License | Apache/LinkedIn |
开发语言 | Java | Erlang | Scala |
支持的协议 | OpenWire、STOMP、REST、AMQP、XMPP | AMQP | 仿AMQP |
事务 | 支持 | 不支持 | 0.11开始支持 |
集群 | 支持 | 支持 | 支持 |
负载均衡 | 支持 | 支持 | 支持 |
动态扩容 | 不支持 | 不支持 | 支持(zk) |
Apache Kafka是一个分布式流处理平台,流处理平台特性如下:
AMQP(Advanced Message Queuing Protocol)是一个提供统一消息服务的标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件而设计。
AMQP服务器端(Broker):用来接收生产者发送的消息并将这些消息路由给服务器中的队列
消费者(Consumer):从消息队列中请求消息的客户端应用程序
生产者(Producer):向broker发布消息的客户端应用程序,往某个Topic上发布消息,生产者也负责选择发布到Topic上的哪一个分区,开发者负责选择分区的算法。
数据主题(Topic):数据记录发布的地方,可以用来区分业务系统。kafka中的topics总是多订阅者模式,一个topic可以拥有一个或者多个消费者来订阅它的数据。
Properties props = new Properties();
props.put("batch.size", 16384);
props.put("lingers.ms", 16384);
props.put("acks", "all");
props.put("retries", 1);
Producer<String, String> producer = new KafkaProducer(props);
ProducerRecord<String, String> record = new ProducerRecord<String, String>("my-topic", "key", "value");
producer.send(record);
producer.close();
Producer会为每个partition维护一个缓冲,用来记录还没有发送的数据,每个缓冲区大小用batch.size指定,默认值为16k。
linger.ms:buffer中的数据在达到batch.size前,需要等待的时间 acks用来配置请求成功的标准
Kafka Simple Consumer
simple consumer位于kafka.javaapi.consumer包中,不提供负载均衡、容错的特性
每次获取数据都要只要topic/partition/offset/fetchSize
High-level Consumer
该客户端透明地处理kafka broker异常,透明地切换consumer的partition,通过和broker交互来实现consumer group级别的负载均衡。
kafka更好的替换传统的消息系统,消息系统被用于各种场景(如解耦数据生产者,缓存未处理的消息),与大多数消息系统比较,kafka有更好的吞吐量、内置分区、副本和故障转移等功能,这有利于处理大规模的消息。
根据官方的经验,通常消息传递使用较低的吞吐量,但可能要求较低的端到端延迟,kafka提供强大的持久性来满足这一要求。
在这方面,kafka可以与传统的消息传递系统(ActiveMQ和RabbitMQ)相媲美。
许多人使用kafka来替代日志聚合解决方案。
日志聚合系统通常从服务器收集物理日志文件,并将其置于一个中心系统(可能是文件服务器或HDFS)进行处理。
kafka从这些日志文件中提取信息,并将其抽象为一个更加清晰的消息流。这样可以实现更低的延迟处理且易于支持多个数据源及分布式数据的消耗。
与Scribe或Flume等以日志为中心的系统相比,kafka具备同样出色的性能、更强的耐用性(因为复制功能)和更低的端到端延迟。
从0.10.0.0开始,kafka支持轻量,但功能强大的流处理。
kafka消息处理报包含多个阶段。其中原始输入数据是从kafka主题消费的,然后汇总,丰富,或者以其他的方式处理转化为新主题以供进一步消费或后续处理。
例如,一个推荐新闻文章,文章内容可能从“articles”主题获取;然后进一步处理内容,得到一个处理后的新内容,最后推荐给用户。这种处理是基于单个主题的实时数据流。
除了kafka streams,还有apache storm和apache samza也是不错的流处理框架。
Event sourcing是一种应用程序设计风格,按时间来记录状态的更改。kafka可以存储非常多的日志数据,为基于event sourcing的应用程序提供强有力的支持。
kafka可以从外部为分布式系统提供日志提交功能。日志有助于记录节点和行为间的数据,采用重新同步机制可以从失败节点恢复数据。kafka的日志压缩功能支持这一用法。这一点与Apache BookKeeper项目类似。
聊一聊顺序消息
网易云课堂《Java高级开发工程师》
本人所有博客仅用于学习记录,不做任何商业用途,如涉及侵权,还请联系删除,感谢阅读,欢迎留言,一起进步~