小编bur*_*yan的帖子

将Kafka的murmur2实现移植到Go

Kafka的JVM客户端将murmur2哈希的自定义实现用于其默认分区程序。

Go的Kafka客户端均未实现此哈希算法,当您需要在不同平台上的不同客户端之间保持一致的分区时,会带来各种问题。

我正在尝试将此代码移植到Go,它似乎适用于某些值,但不适用于其他值。

这是Java代码(来源在这里:https : //github.com/apache/kafka/blob/1.0.0/clients/src/main/java/org/apache/kafka/common/utils/Utils.java# L353 ):

public static int murmur2(final byte[] data) {
    int length = data.length;
    int seed = 0x9747b28c;
    // 'm' and 'r' are mixing constants generated offline.
    // They're not really 'magic', they just happen to work well.
    final int m = 0x5bd1e995;
    final int r = 24;

    // Initialize the hash to a random value
    int h = seed ^ length;
    int length4 = length / 4;

    for (int i = 0; i …
Run Code Online (Sandbox Code Playgroud)

java hash encoding go apache-kafka

5
推荐指数
1
解决办法
579
查看次数

Kafka Streams 在处理时间窗口内排序

我想知道是否有任何方法可以使用 Kafka Streams DSL 或 Processor API 对窗口内的记录进行排序。

以以下情况为例(任意一种,但与我需要的类似):

  1. 有一些事件的 Kafka 主题,比如说用户点击。假设主题有 10 个分区。消息按键进行分区,但每个键都是唯一的,因此它是一种随机分区。每条记录都包含一个用户 ID,稍后会使用该用户 ID 对流进行重新分区。

  2. 我们消费流,并将每条消息发布到另一个主题,根据用户 ID 对记录进行分区(按用户 ID 重新分区原始流)。

  3. 然后我们消费这个重新分区的流,我们将消费的记录存储在窗口化 10 分钟的本地状态存储中。一个特定用户的所有点击总是在同一个分区,但顺序没有保证,因为原始主题有10个分区。

  4. 我了解Kafka Streams的窗口模型,当新记录进来时,时间会提前,但我需要这个窗口使用处理时间,而不是事件时间,然后当窗口过期时,我需要能够对缓冲进行排序事件,并按顺序将它们发送到另一个主题。

注意:

  1. 我们需要能够使用处理时间而不是事件时间来刷新/处理窗口内的记录。我们不能等待下一次点击来提前时间,因为它可能永远不会发生。

  2. 我们需要从商店中删除所有记录,尽快对窗口进行排序和刷新。

  3. 如果应用程序崩溃,我们需要恢复(在应用程序的同一个或另一个实例中)并处理所有未处理的窗口,而不需要等待特定用户的新记录。

我知道 Kafka Streams 1.0.0 允许在处理 API 中使用挂钟时间,但我不确定实现我需要的正确方法是什么(更重要的是考虑到上述恢复过程要求)。

stream-processing apache-kafka apache-kafka-streams

5
推荐指数
1
解决办法
3943
查看次数