我希望将Kafka设置为来自IoT机器的数据和将处理该数据的服务之间的中介。 我有一些问题需要根据我的用例确定设计主题的正确方法,并且会喜欢一些建议。
我希望从许多机器读取传感器数据,每台机器可能有许多传感器。例如(温度,压力,零件等..) 我的消费者会读到的这些消息的顺序很重要,需要按顺序排列。
我提出了三种可能的设计,但我不确定哪种设计最好,如果有的话?
a)每台机器将写入具有1个分区的特定主题以保证序列。因此机器100将写入名为的主题:machine100TempSensor1,machine100TempSensor2,machine100PressureSensor1等。
b )所有机器都会写入一个主题,但分区将基于机器/传感器,所以使用与上面相同的示例, 机器100将写入一个名为“温度”的主题,但将在机器和传感器上进行键控。
例如。
(主题:温度,分区:machine100TempSensor1)
(主题:温度,分区:machine100TempSensor2)
(主题:温度,分区:machine200TempSensor1)
c)生成与温度主题相关的所有温度消息,并在处理数据时过滤消息。
我对所有解决方案的关注,
A)
- Kafka只保证分区级别的顺序,所以用单个分区创建一个主题是个好主意还是与主题应该是什么相反?
- 如果我想从所有机器上读取“温度”,我必须知道名称并从特定主题请求数据而不是一般的“温度”主题。
- Kafka说只有一个消费者群体可以从一个分区读取,所以我必须创建许多消费者群体。
b)中的
- 如果我考虑缩放,单个“温度”主题可能有30多个分区,如果不是100s / 1000s。 (但我会立即阅读所有分区的好处)
- 由于只有一个消费者群体能够从单个分区中读取,因此我将为每个消费者提供一个消费者群组。
C) - 我觉得过滤成千上万条无用的邮件会有很大的性能成本 - 当将处理后的数据推送到kafka时,我会遇到同样的问题。
需要考虑的是我希望能够处理某些机器/传感器。
希望我能够清楚地解释一切。
答案 0 :(得分:4)
您对卡夫卡的整体理解并非100%正确。
1)Kafka基本上可以扩展分区 - 因此,对于经纪人而言,如果您使用1个主题,1000个主题的1000个分区,每个分区1个分区,则没有区别(从性能角度来看)。 (如果您打算使用Kafka Streams(又名Streams API),使用带有1000个分区的单个主题会更好,因为Kafka Streams在各个主题上的扩展性不是很好。)
2)创建单个分区主题以保证在基本绝对正常的情况下进行排序。对于一次订阅多个主题,如果您相应地命名主题,则可以使用模式订阅。
3)单个代理可以托管多个分区。因此,即使考虑到复制,您也不需要庞大的集群。
4)这种说法听起来不正确(或者我可能不理解):
Kafka表示只有一个消费者群体可以从一个分区读取,因此我必须创建许多消费者群体。
也许您的意思是,一个消费者群体中只有一个消费者。这是正确的。如果您有一个使用者组,则可以将每个分区(手动或使用内置使用者组管理)分配给组内最多一个使用者。如果多个应用程序想要读取同一分区,则只需要多个使用者组。
5)你对(c)的关注似乎是合法的。