C++和java通过kafka、protobuf传递消息的一些问题

本文记录了在C++端使用protobuf序列化数据并通过Kafka发送到Java端过程中遇到的问题。最初,由于二进制字节差异导致protobuf解析失败,尝试使用base64编码进行传递。后来发现,错误在于Java端将数据作为字符串处理,正确做法应直接读取byte[]并解析protobuf。调整Java端消费者配置为使用`StringDeserializer`处理字节数组,避免了base64转换步骤。
摘要由CSDN通过智能技术生成

最近项目需要在c++端写入数据源到kafka中,使用flink程序分析数据源,首先想到的方法就是利用protobuf做序列化和反序列化。

遇到一些问题,记录一下。

首先准备好pb文件,C++端序列化成二进制文件,代码如下

 int size = test.ByteSize();
 char buffer[1024];
 test.SerializeToArray(buffer, size);

test为C++生成的pb的类。

 RdKafka::ErrorCode err = _producer->produce(
            /* Topic name */
            topic,
            /* Any Partition: the builtin partitioner will be
             * used to assign the message to a topic based
             * on the message key, or random partition if
             * the key is not set. */
            RdKafka::Topic::PARTITION_UA,
            /* Make a copy of the value */
            RdKafka::Producer::RK_MSG_COPY /* Copy payload */,
            /* Value */
            buffer, len,
            /* Key */
            NULL, 0,
            /* Timestamp (defaults to current time) */
            0,
            /* Message headers, if any */
            NULL);

然后通过rdkafka的api把二进制写入kafka中(代码省略了初始化和各种变量的说明部分),

 

java端的数据消费代码如下:

 while (true) {
            ConsumerRecords<String, String> records = consumer.poll(8000);
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("offset = %d, key = %s, value = %s,value size = %d %n", record.offset(), record.key(), record.value(),record.value().length());
                try{
                    byte[] debytes = record.value().getBytes();
                    for(int i = 0;i < debytes.length;i++){
           
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值