这个版本主要解决了与消息反序列化有关的问题,并规范了一些命名规则,以便在升级到即将到来的2.0 版本时更方便。
注意:这个版本是最后一个使用ruby-kafka 的版本。我们已经开始转移到rdkafka-ruby 。
注意:如果你正在使用Sidekiq-Backend 插件,请确保在升级Karafka宝石之前,你已经处理了Sidekiq队列中的所有作业。
变化(功能、不兼容等)
consumer#metadata 现在是consumer#batch_metadata
这个变化是微不足道的:如果您使用批处理消耗模式,并且您使用Consumer#metadata 方法,请将其替换为Consumer#batch_metadata 。
# Karafka 1.3
class UsersConsumer < ApplicationConsumer
def consume
puts metadata
end
end
# Karafka 1.4
class UsersConsumer < ApplicationConsumer
def consume
puts batch_metadata
end
end
消息元数据在#metadata 方法下可用
直到1.3 ,所有的消息元数据都可以在params 对象的根范围内直接使用,既可以直接引用方法,也可以使用#[] 访问器。
虽然这感觉像 "Rails的方式",但它有几个副作用,其中最大的副作用是需要有一个类似哈希的API,在没有反序列化有效载荷的情况下访问元数据的问题,以及有效载荷和元数据之间缺乏明确的分离。
从现在开始,你可以使用params.metadata 对象来获取所有的元数据。
注意:我们保留了从params 对象中直接获取元数据值的做法,以保持向后兼容。
# 1.3
params['partition'] #=> 0
params.partition #=> 0
# 1.4
params['partition'] #=> NoMethodError (undefined method '[]')
# This will work due to backward compatibility
params.partition #=> 0
# This is the recommended way of accessing metadata
params.metadata.partition #=> 0
# This will also work as metadata is a struct now
params.metadata[:partition] #=> 0
params.metadata['partition'] #=> 0
允许在没有消息反序列化的情况下访问消息元数据
当访问元数据时,在使用#payload 方法之前,有效载荷是不会被反序列化的。
默认JSON反序列化器中的空消息支持
当Kafka消息的有效载荷是null /nil ,反序列化就不会失败。由于一些Karafka用户使用带有nil 有效载荷的日志压缩,所以增加了对它的支持。在这种情况下,#payload 将返回nil 。
Karafka::Params::Params 不再继承于一个Hash
Karafka::Params::Params 现在只是一个结构。这一改变是为了使设置正常化,限制角落里的情况,并将接口简化为真正需要的方法。
开始使用Karafka
如果你想尽快开始使用Kafka和Karafka,那么最好的办法就是直接克隆我们的示例仓库。
git clone https://github.com/karafka/example-app ./example_app
然后,捆绑安装所有的依赖项。
cd ./example_app
bundle install
并按照[示例应用程序Wiki]的说明进行操作。