关于kafka处理大消息的方法

    最近发现kafka在发送一些大消息的时候会报错,修改了配置max.request.size。问题依旧。
    后来查阅了一下,都说要调大限制message大小的参数,不过试过之后发现貌似没什么作用。查阅文档发现之前用的客户端kafka已经三年没更新了0.0,后改为目前官方推荐的客户端confluent_kafka,加上"message.max.bytes"参数。然而依旧没什么作用。。。

改道!!!初步制定了三个方案。

一。引用外部存储,然后用kafka推送地址。

    觉得这个方法不是太好。首先需要维护外部存储,然后kafka的消费端拿到数据后需要在判断。而且这些数据并不是我们要的最终形态。而且这个存储保存多久呢?在时间和空间上都有浪费。

二。压缩

    kafka的数据支持压缩,初步测试了一下,压缩率还可以。但是还有其他的问题。如果数据重复的内容比较少,或者压缩率很低,再或者压缩后的大小依然超过了1M,那么怎么办。而且带来了第二个问题。在处理压缩的大文件时,处理时间会比较长,会引发timeout问题。再消费过程中,一条大消息还没消费完,已经timeout,那么offset并没有递交偏移,就会出现重复消费,死循环的问题!!!

三。切片

    将大消息分隔成多个,然后通过在客户端指定key的方式,将数据发送到同一个partition。

    kafka的机制是通过key计算一个hashcode,然后用hashcode/partition去余,然后发送到对应的partition。从而保证相同的key,消息存储在同一个partition。

    kafka在同一个partition中的消息是有序的。

    这样在消费端拿到数据,只需要做个缓存拼接就可以了。有人可能担心,如果同一个group_id中有多个消费者,会不会导致消息乱了呢?这里要说一下kafka的机制。kafka推荐partition的个数最好是相同group_id中客户端数的整数倍。是因为kafka同组呢的消息分发,不是分配的消息,而是分配的partition。这样就保证了同组中无论有多少个消费者,同一个partition的数据都只会被一个消费者消费。切片的方法麻烦一点,不过一劳永逸,而且能保证高效的传输。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值