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_Architecture_Kafka Consumer Api_Spring Kafka - Fatal编程技术网

Apache kafka 设计卡夫卡消费者和生产者以实现可扩展性

Apache kafka 设计卡夫卡消费者和生产者以实现可扩展性,apache-kafka,architecture,kafka-consumer-api,spring-kafka,Apache Kafka,Architecture,Kafka Consumer Api,Spring Kafka,我想设计一个解决方案,用于向多个提供商发送不同类型的电子邮件。概述 我有几个上游提供商Sendgrid、Zoho、Mailgun等。它们将用于发送电子邮件等。例如: 注册新用户的电子邮件 删除用户的电子邮件 空间配额限制的电子邮件 (一般约6种类型的电子邮件) 每种类型的电子邮件都应该生成为生产者,转换为序列化的Java对象,并发送给与上游提供者集成的相应Kafka消费者 问题是如何设计Kafka以获得最大的性能和可扩展性 到目前为止,我所能想到的第一个解决方案是为每种类型的电子邮件和每

我想设计一个解决方案,用于向多个提供商发送不同类型的电子邮件。概述

我有几个上游提供商Sendgrid、Zoho、Mailgun等。它们将用于发送电子邮件等。例如:

  • 注册新用户的电子邮件
  • 删除用户的电子邮件
  • 空间配额限制的电子邮件
(一般约6种类型的电子邮件)

每种类型的电子邮件都应该生成为生产者,转换为序列化的Java对象,并发送给与上游提供者集成的相应Kafka消费者

问题是如何设计Kafka以获得最大的性能和可扩展性

  • 到目前为止,我所能想到的第一个解决方案是为每种类型的电子邮件和每个网关设置主题(6x4=24个主题)。在未来,我希望添加更多类型的消息和网关。可能会达到600个话题。这将产生大量用于维护的Java源代码和大量需要管理的主题。另一个不利因素是卡夫卡的日志将是巨大的

  • 第二个解决方案是为每个消费者使用一个主题(集成网关)。但是在这种情况下,如何根据要发送的消息类型发送每种类型的不同序列化Java对象呢

有没有更好的方法来设计这个设置,使我可以更容易地扩展它,并使它对未来的集成非常健壮

您可以在这里看到我如何在消费者和生产者之间发送消息:

编辑:

  • 订单很重要,因为通信是异步的。生产者将等待返回的状态消息
  • 将每个网关的数据保留在不同的主题上并不重要
  • 你想要什么样的隔离? 我希望将消息/主题彼此完全隔离,以防止将来需要添加更多网关或消息类型时出错
  • 将每个网关的数据保留在不同的主题上对您来说重要吗不,我只想隔离数据

    如果您希望每个网关使用一个主题,那么您是否关心它会在客户端造成的开销读取不必要的消息、编写更多逻辑、混合序列化程序等


    我不知道这里。我的主要目的是使用新功能使系统易于扩展。

    我认为对于您提到的操作开销来说,每个事件类型一个主题确实太多了

    我认为选项2是正确的方式-每个集成网关一个主题,有专门的消费者。优点是:

    • 在主题级别隔离工作负载(集成网关A上的许多消息不会影响网关B的使用者)
    • 您可以根据主题工作负载扩展使用者

    生产者将根据网关的要求序列化消息,并在特定主题上发布消息。消费者只需阅读并推送消息。

    我认为对于您提到的操作开销来说,每种事件类型一个主题确实太多了

    我认为选项2是正确的方式-每个集成网关一个主题,有专门的消费者。优点是:

    • 在主题级别隔离工作负载(集成网关A上的许多消息不会影响网关B的使用者)
    • 您可以根据主题工作负载扩展使用者

    生产者将根据网关的要求序列化消息,并在特定主题上发布消息。消费者只需阅读并推送信息。

    很遗憾,这里没有简单的答案。
    你需要问自己几个问题,并从几个权衡中做出选择-

    首先,顺序重要吗?您只是想将电子邮件从A点转发到B点吗?还是(我想您会)对同一实体保持合理的事件顺序(例如,在发送更改密码的同一新用户的邮件之前,需要先收到关于用户创建的邮件)。

    如果顺序很重要,那么最好使用相同的主题,因为Kafka只在分区级别保证消息的顺序

    你想要什么样的隔离?将每个网关的数据保留在不同的主题上对您来说重要吗?
    如果您希望每个网关使用一个主题,那么您是否关心它会在客户端造成的开销读取不必要的消息、编写更多逻辑、混合序列化程序等

    你能估计一下你会在哪些维度上进行缩放吗如果您使用第一个解决方案,即每个网关和事件类型的主题,突然需要添加100倍的网关,那么这不一定是正确的选择。此外,如果您需要更快地处理
    用户更改电子邮件
    ,会发生什么情况你能这样做吗


    Confluent很少有关于这些主题的好文章可以帮助你-


    不幸的是,这里没有简单的答案。
    你需要问自己几个问题,并从几个权衡中做出选择-

    首先,顺序重要吗?您只是想将电子邮件从A点转发到B点吗?还是(我想您会)对同一实体保持合理的事件顺序(例如,在发送更改密码的同一新用户的邮件之前,需要先收到关于用户创建的邮件)。

    如果顺序很重要,那么最好使用相同的主题,因为Kafka只在分区级别保证消息的顺序

    你想要什么样的隔离?将每个网关的数据保留在不同的主题上对您来说重要吗?
    如果您希望每个网关使用一个主题,那么您是否关心它在客户端造成的开销