Node.js 如何使用nodejs向kafka 10消息添加时间戳

Node.js 如何使用nodejs向kafka 10消息添加时间戳,node.js,timestamp,apache-kafka,node-red,kafka-producer-api,Node.js,Timestamp,Apache Kafka,Node Red,Kafka Producer Api,我使用nodejs在node red中重新编写了一个Kafka生产者节点。 我注意到Kafka10增加了关于在发送给生产者的消息上附加时间戳的特性,但我只找到了java示例。 如何使用nodejs向消息添加时间戳 下面我将报告producer是如何在nodejs中实现的: function kafkaAdvancedNode(config) { RED.nodes.createNode(this,config); var topic = config.topic; var

我使用nodejs在node red中重新编写了一个Kafka生产者节点。 我注意到Kafka10增加了关于在发送给生产者的消息上附加时间戳的特性,但我只找到了java示例。 如何使用nodejs向消息添加时间戳

下面我将报告producer是如何在nodejs中实现的:

function kafkaAdvancedNode(config) {
    RED.nodes.createNode(this,config);
    var topic = config.topic;
    var partition = config.partition;
    var clusterZookeeper = config.zkquorum;
    var debug = (config.debug == "debug");
    var node = this;
    var kafka = require('kafka-node');
    var HighLevelProducer = kafka.HighLevelProducer;
    var Client = kafka.Client;
    var topics = config.topics;
    var client = new Client(clusterZookeeper);

    try {
        this.on("input", function(msg) {
            var payloads = [];

            // check if multiple topics
            if (topics.indexOf(",") > -1){
                var topicArry = topics.split(',');

                for (i = 0; i < topicArry.length; i++) {
                    payloads.push({topic: topicArry[i], messages: msg.payload});
                }
            }
            else {
                if(partition == "" || !partition)
                    payloads = [{topic: topics, messages: msg.payload}];
                else
                    payloads = [{topic: topics, messages: msg.payload, partition: partition}];
            }

            producer.send(payloads, function(err, data){
                if (err){
                    node.error(err);
                }
                node.log("Message Sent: " + data);
            });
        });
    }
    catch(e) {
        node.error(e);
    }
    var producer = new HighLevelProducer(client);
    this.status({fill:"green",shape:"dot",text:"connected to "+clusterZookeeper});
}
函数kafkaAdvancedNode(配置){
RED.nodes.createNode(这个,配置);
var topic=config.topic;
var partition=config.partition;
var clusterZookeeper=config.zkquorum;
var debug=(config.debug=“debug”);
var节点=这个;
var kafka=require('kafka-node');
var HighLevelProducer=kafka.HighLevelProducer;
var Client=kafka.Client;
var topics=config.topics;
var客户端=新客户端(clusterZookeeper);
试一试{
此.on(“输入”,函数(msg){
var有效载荷=[];
//检查是否有多个主题
if(topics.indexOf(“,”>-1){
var topicArry=topics.split(',');
对于(i=0;i
在谷歌上,我发现了以下内容:


但实际上我不明白如何在代码中集成(什么是Avro?

我认为kafka节点不支持0.10 kafka协议,所以它不可能支持消息上的时间戳

出于这个(和其他)原因,我使用节点rdkafka编写了类似的东西,并将其发布为节点red contrib rdkafka。看


更新:我刚刚发布了node red contrib rdkafka的新版本(0.2.0),它支持0.10“事件时间”或“处理时间”时间戳以及动态主题、键和分区

不幸的是,在raspberry pi上,我在尝试安装它时收到一个错误。链接->我明白了,你没提到这是在树莓皮上运行的。这个错误可能是由C语言编写的嵌入式librdkafka库造成的。我还编写了一个纯JavaScript节点red contrib confluent模块,用于rPI等嵌入式设备。它使用合流REST代理向Kafka发布/订阅。这将自动将时间戳设置为摄取时间。它还可以通过防火墙和互联网更好地工作,因为它使用HTTP直到代理,并将Kafka协议限制在数据中心/云中。这对我不太好,我的时间戳嵌入了传感器数据中,传感器数据是JSON LDIf Flink可以从消息体中提取时间,那么不管时间戳是什么(如果有的话)在卡夫卡信的外信封上。卡夫卡时间戳用于消息保留和卡夫卡流应用程序。但是,我将尝试让节点red contrib rdkafka在raspberry pi上编译,并对其进行增强,以允许手动设置卡夫卡协议时间戳。更新答案以反映节点red contrib rdkafka中添加的时间戳和密钥/值消息。我还和《librdkafka》的作者谈过,他认为它应该在Raspberry Pi上起作用,所以我将继续尝试让这个新版本也在rpi上起作用。