使用Kafka批量发送邮件

Ale*_*ton 6 apache-kafka

所以我从第一次听说卡夫卡的想法开始就喜欢它,但直到最近我才有机会接触它。我想我有一个可能适用的用例,但我想从更熟悉它的人那里得到一些意见。

基本上,我正在考虑一个通知系统,它可以在给定的时间段(比如 30 分钟)内批量处理消息,并将它们作为电子邮件、应用程序内通知或其他方式发送出去。我喜欢 Kafka 解决这个问题,主要是因为它固有的耐用性。我曾考虑使用更直接的消息队列,如 RabbitMQ、ActiveMQ、SQS 等,但我不喜欢它会迫使我在消费者端管理缓冲并冒丢失消息的风险。否则,我将不得不在二级持久存储中进行缓冲,这似乎违背了首先拥有队列的目的。

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

我有几个顾虑:

  1. 我疯狂地认为这是一个很好的用例吗?通过一点谷歌搜索,我没有看到很多人在谈论使用 Kafka 正是为了这个目的,但它对我来说似乎非常完美。
  2. 我应该如何处理个别通知错误?例如,假设用户在 30 分钟的窗口中收到 50 条通知,这些通知将分为 3 条不同的消息,分别发送。假设两个成功但一个失败,我应该如何处理重试逻辑?我发现了一些相对较新/晦涩的东西,例如https://github.com/softwaremill/kmq似乎试图解决这个问题,但我有点担心我担心这不适合卡夫卡模型。
  3. 我只是在违背常规吗?当然,这是人们每天都在构建的一个已解决的问题。有没有我忽略的更简单、更明显的技术?

感谢您的反馈意见!

Ste*_* Hu 3

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

澄清评论中的两点。

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

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