使用Kafka发送批量电子邮件

时间:2018-04-11 02:00:10

标签: apache-kafka

所以,自从我第一次听说卡夫卡以来,我一直很喜欢卡夫卡的想法,但直到最近我还没有机会亲自动手。我想我有一个可能适用的用例,但我想从更熟悉它的人那里得到一些意见。

基本上我正在考虑一个通知系统,该系统会在给定的时间段(比如说30分钟)内批量处理邮件,并将其作为电子邮件,应用程序内通知或其他方式发送出去。我喜欢卡夫卡这个问题主要是因为它固有的耐用性。我曾考虑使用像RabbitMQ,ActiveMQ,SQS等更直接的消息队列,但我不喜欢它会迫使我在消费者方面管理缓冲并冒着丢失消息的风险。否则我将不得不缓冲在一个二级耐用商店,这似乎打败了首先拥有队列的目的。

所以我的想法是按用户将通知分组,然后每30分钟,消费者会读取最后30分钟的数据,汇总数据,并发送由各个通知组成的摘要通知。

我有一些顾虑:

  1. 我是否因为认为这是一个很好的用例而疯狂?通过一点谷歌搜索,我没有看到很多人谈论使用Kafka正是为了这个目的,但它对我来说似乎是完美的。
  2. 我应该如何处理个别通知错误?例如,用户在30分钟的窗口中收到50个通知,这些通知将分为3个不同的消息,分别发送出去。让我们说两个成功但一个失败,我应该如何处理重试逻辑?我发现了一些像https://github.com/softwaremill/kmq这样似乎试图解决这个问题的相对新的/模糊的东西,但是我担心我担心这个不适合卡夫卡模特。
  3. 我只是反对谷物?当然,这是人们每天建立的解决问题。是否有一种我能忽视的更简单明了的技术?
  4. 感谢您的反馈!

1 个答案:

答案 0 :(得分:0)

现在回答这个问题可能为时已晚,我想您可能已经有了解决方案。对于考虑同一件事的其他用户,我想说您的想法非常好,尤其是在考虑使用Kafka Streams时。我现在正在使用Kafka Streams和Kotlin构建一个名为light-email的项目。目前,我正在考虑为每个活动发送电子邮件;但是,在Kafka Streams中的一个时间窗口内将多个事件聚合在一起非常容易。

从注释中澄清两点。

  1. 我们不需要为每个用户创建一个分区。只需要确保事件属于同一用户就可以进入同一分区。这只是意味着我们需要对用户ID进行哈希处理以在分区之间进行负载平衡。

  2. 当消息发送失败时,应将其移至无用信主题,以便稍后处理。这是为了防止当前主题被阻止。