Kafka是否支持按记录提取

时间:2019-10-11 12:40:07

标签: apache-kafka

截至 OCTOBER 2019 Kafka v2.3.0 Zookeeper v3.5.5

  

场景:

请考虑以下情况,在此情况下,消费者可以根据以下假设从某个主题获取记录;

  1. 提取的设计方式是,根据每 个字节容量 的提取量,它可以以1张记录的形式提取 N 个记录。这以max.partition.fetch.bytes之类的配置参数的形式实现和提供。
  2. 提取的设计方式是,它可以根据 记录数 的提取来提取 N 条记录。因此,如果我将该参数设置为1,这意味着它将在每次获取尝试时获取1条记录。这就是卡夫卡目前所缺少的。这可能是由于设计范例以及对流,并发,分区功能等的支持。
  

问题:

  1. 当前有什么方法可以使我每次提取仅获取1条记录并相应地工作?
  2. 我的应用程序既需要实时记录流,又需要每次获取1条记录。两者都可以使用Kafka来实现,还是我不得不使用2种不同的消息系统,例如Kafka + ActiveMQ等?

请对此进行指导。提前非常感谢您。

1 个答案:

答案 0 :(得分:0)

NPM软件包 kafkajs 确实支持并帮助您使用 fetch_per_record 机制,以下是实现此目的的示例代码,

const { Kafka } = require('kafkajs')

const kafka = new Kafka({
  clientId: 'my-app',
  brokers: ['192.168.1.172:9092']
})

const consumer = kafka.consumer({ groupId: 'test-group' })

const run = async () => {

  await consumer.connect()
  await consumer.subscribe({ topic: 'test', fromBeginning: false })

  await consumer.run({
    eachMessage: async ({ topic, partition, message }) => {
      console.log({
        partition,
        offset: message.offset,
        value: message.value.toString(),
      })
    },
  })
}

run().catch(console.error);

在上面的代码中,您有eachMessage方法可帮助我们实现此机制