Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 卡夫卡制作人配额_Apache Kafka_Apache Storm_Messaging_Throttling - Fatal编程技术网

Apache kafka 卡夫卡制作人配额

Apache kafka 卡夫卡制作人配额,apache-kafka,apache-storm,messaging,throttling,Apache Kafka,Apache Storm,Messaging,Throttling,以下是我们物联网平台中的入站消息流程: Device ---(MQTT)---> RabbitMQ Broker ---(AMQP)---> Apache Storm ---> Kafka 我希望实现一个解决方案,该解决方案可以有效地限制/限制每个客户端每秒向Kafka发布的数据量 当前的策略利用了Guava的RateLimitor,每个设备都有自己的本地缓存实例。当接收到设备消息时,将从缓存中提取映射到该设备ID的RateLimiter,并调用tryAquire()方法。如

以下是我们物联网平台中的入站消息流程:

Device ---(MQTT)---> RabbitMQ Broker ---(AMQP)---> Apache Storm ---> Kafka
我希望实现一个解决方案,该解决方案可以有效地限制/限制每个客户端每秒向Kafka发布的数据量

当前的策略利用了Guava的RateLimitor,每个设备都有自己的本地缓存实例。当接收到设备消息时,将从缓存中提取映射到该设备ID的RateLimiter,并调用
tryAquire()
方法。如果成功获得许可证,则元组将像往常一样转发给Kafka,否则,将超出配额,消息将被无声地丢弃。这种方法相当麻烦,在某个时候注定要失败或成为瓶颈

我一直在阅读Kafka的字节率配额,并相信这在我们的案例中会非常有效,特别是因为Kafka客户端可以动态配置。在我们的平台中创建虚拟设备时,应添加一个新的client.id,其中
client.id==deviceId

让我们假设以下用例作为示例:

  • 管理员创建2个虚拟设备:湿度和温度传感器
  • 将触发一条规则,以便在Kafka中为上述设备创建新的用户/客户端ID条目
  • 通过Kafka CLI设置其生产者配额值
  • 两个设备都发出入站事件消息
  • 这是我的问题。如果使用单个Producer实例,是否可以在调用
    send()
    之前在ProducerRecord中或Producer中的某个位置指定
    客户端.id
    ?如果生产者只能有一个
    客户端.id
    ,这是否意味着每个设备都必须有自己的生产者?如果只允许一对一映射,那么是否明智地缓存数百(如果不是数千)个生产者实例,每个设备一个实例?有没有更好的方法我还不知道


    注意:我们的平台是一个“开放式系统”,这意味着客户端永远不会收到错误响应,如“超出速率”或任何相关错误。它对最终用户是透明的。因此,我不能干扰RabbitMQ中的数据,也不能将消息重新路由到不同的队列。。我唯一的选择就是在暴风雪和卡夫卡之间整合这些东西

    虽然您可以在
    Producer
    对象上指定
    client.id
    ,但请记住它们是重量级的,您可能不愿意创建它们的多个实例(尤其是每个设备一个实例)

    关于减少
    生产者的数量
    ,您是否考虑过为每个用户创建一个生产者,而不是为每个设备创建一个生产者,或者甚至拥有一个有限的生产者共享池?然后,卡夫卡消息头可以用来识别实际生成数据的设备。缺点是您需要限制消息的生成,这样一个设备就不会从其他设备获取所有资源

    但是,您可以限制Kafka broker端的用户,配置应用于默认用户/客户端:

    > bin/kafka-configs.sh  --zookeeper localhost:2181 --alter --add-config 'producer_byte_rate=1024,consumer_byte_rate=2048,request_percentage=200' --entity-type clients --entity-default
    Updated config for entity: default client-id.
    
    有关更多示例和深入解释,请参见

    如何识别消息取决于您的体系结构,可能的解决方案包括:

    • 每个用户的主题/分区(例如
      数据用户abcdef
    • 如果您决定使用公共主题,那么您可以将生产者数据放入消息头中,也可以将它们放入有效负载本身中

    您可以通过应用程序配置
    client.id
    properties.put(“client.id”、“湿度”)
    properties.put(“client.id”、“temp”)
    根据每个
    client.id
    可以设置值

    producer_byte_rate = 1024, consumer_byte_rate = 2048,
    request_percentage = 200
    
    如果怀疑我与此配置有关(
    producer\u byte\u rate=1024,consumer\u byte\u rate=2048,request\u percentage=200
    ),则生产者不会假设插入的配置,因为消费者工作正常。

    “卡夫卡消息头可用于识别实际生成数据的设备。”请你详细说明一下,并解释一下如何实施它?即使我是基于每个用户进行的,我仍然需要弄清楚如何告诉卡夫卡消息X来自客户端1,消息Y来自客户端2,等等。。所有这些都是通过一个共享的生产者实例发布的。