redis - 关于将事件从redis转移到kafka的问题

标签 redis apache-kafka kafka-producer-api event-sourcing distributed-transactions

我有一个问题与事件驱动系统中的棘手情况有关,我想寻求建议。这是情况:

在我们的系统中,我使用redis作为memcached数据库,kafkaa作为消息队列。为了提高redis的性能,我使用lua脚本来处理数据,同时将事件推送到redis的一个阻塞列表中。然后会有一个过程在那个阻止列表中挑选redis事件并将它们移动到kafka。所以在这个过程中,有3个步骤:

1) 从redis列表中读取事件
2)批量生产到kafka
3)删除redis中对应的事件

不幸的是,如果进程在2到3之间死掉了,也就是说把所有的事件都生产到kafka中后,并没有删除redis中相应的事件,那么这个进程重启之后,就会把重复的事件生产到kafka中,即 Not Acceptable 。因此,是否有人对此问题有任何解决方案。在此先感谢,我真的很感激。

最佳答案

Kafka 很容易重新处理事件,即使只写一次。重新处理几乎肯定是由重新平衡客户端引起的。重新平衡可能由以下原因触发:

  • 修改主题的分区。
  • 重新部署服务器和随后的客户端暂时不可用。
  • 消息消耗缓慢,代理随后重新创建客户端。

换句话说,如果您需要确保消息只被处理一次,您需要在客户端确保这一点。您可以这样做,方法是设置一个分区键,以确保同一客户端以顺序方式使用相关消息。然后,该客户可以维护他已处理内容的数据库记录。

关于redis - 关于将事件从redis转移到kafka的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52575521/

相关文章:

sql - 哪个数据库用于聊天记录?

linux - 如何将 Redis master 同步到另一个独立的 Redis 实例?

apache-kafka - 使用Kafka主题存储多年数据

python - PyKafka producer.get_delivery_report 在 block=false 时抛出 Queue.empty

docker - 卡夫卡制片人说 “unknown_topic_or_partition”

apache-kafka - Kafka Streams 计算不同的值

node.js - Heroku Redis 去

php - 如何使用 redis 驱动程序在 laravel 4.2 中为特定域设置生命周期?

java - kafka启用默认的循环分区器

python - 为什么pykafka的生产者这么慢?