开源消息系统Apache Kafka, RabbitMQ和NATS比较

  本文从多个方面比较 Apache KafkaRabbitMQ, 和 NATS三个现代开源消息系统的优缺点,这些消息系统和经典传统的ESB软件是有区别的,这些现代新的消息系统特点如下:

  • 现代消息中间件(broker)只擅长一件事,传统消息系统会集成工作流 业务智能和适配器功能,而现代这些OSS服务只注重大量数据的路由,因此非常轻量,具有可配置的部署性。
  • 端点(Endpoint)有显著的责任. 传统消息中间件broker在端点之间有消息转换, 可靠传输以及集成协调等功能, 端点是被动的只是参与集成过程中, 这些现代引擎不会将端点控制权转让给集中式总线,而是只使用总线传输不透明数据,这样端点就更加智能。
  • 集成对于开发人员易于理解. 这些现代OSS工具更易于让开发人员理解。

Apache Kafka

  使用Kafka你可以同时进行实时处理和批处理,能成功持久大量数据,支持重放场景,topic被安排在分区中(能并行),而分区能跨节点复制。下图是 Kafka Manager管理界面:

kafka管理界面

我们使用Node.js测试一下Kafka, kafka-node可以连接Kafka,案例是:写50个消息到"server-stats"的Kafka topic中:

var serverTelemetry = {server:'zkee-022', cpu: 11.2, mem: 0.70, storage: 0.30, timestamp:'2016-05-11:01:19:22'};
 
var kafka = require('../../node_modules/kafka-node'),
    Producer = kafka.Producer,
    client = new kafka.Client('127.0.0.1:2181/'),
    producer = new Producer(client),
    payloads = [
        { topic: 'server-stats', messages: [JSON.stringify(serverTelemetry)] }
    ];
 
producer.on('error', function (err) {
    console.log(err);
});
producer.on('ready', function () {
 
    console.log('producer ready ...')
    for(i=0; i<50; i++) {
        producer.send(payloads, function (err, data) {
            console.log(data);
        });
    }
});

下面是读取这些消息的消费者代码:

var kafka = require('../../node_modules/kafka-node'),
    Consumer = kafka.Consumer,
    client = new kafka.Client('127.0.0.1:2181/'),
    consumer = new Consumer(
        client,
        [
            { topic: 'server-stats' }
        ],
        {
            groupId: 'rta'
        }
    );
 
    consumer.on('message', function (message) {
        console.log(message);
    });

执行完成消费代码后,通过管理界面可以查看topic server-stats中消息已经没有了。

下面再演示一下kafKa数据重放,数据从Kafka移除是基于时间过期策略,如果数据还在的话,消费者就可以返回过去,从某点开始重播,在下面案例中,我们从向前偏移40个位置开始读取,如果失败需要重试:

var kafka = require('../../node_modules/kafka-node'),
    Consumer = kafka.Consumer,
    client = new kafka.Client('127.0.0.1:2181/'),
    consumer = new Consumer(
        client,
        [
            { topic: 'server-stats', offset: 40 } //从前偏移40开始重播
        ],
        {
            groupId: 'rta',
            fromOffset: true
        }
    );
 
    consumer.on('message', function (message) {
        console.log(message);
    });

 

下篇

Apache Kafka简单介绍