Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.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
Python 什么';让消费者从发布/订阅主题中读取消息并将其写入NoSQL数据库的最常见方式是什么?_Python_Database_Apache Spark_Apache Kafka_Publish Subscribe - Fatal编程技术网

Python 什么';让消费者从发布/订阅主题中读取消息并将其写入NoSQL数据库的最常见方式是什么?

Python 什么';让消费者从发布/订阅主题中读取消息并将其写入NoSQL数据库的最常见方式是什么?,python,database,apache-spark,apache-kafka,publish-subscribe,Python,Database,Apache Spark,Apache Kafka,Publish Subscribe,我只需要对每条消息进行最少的解析,即用逗号标记、转换为int并写入数据库 我打算以使用者的身份编写一个Python脚本,并在容器上运行该脚本,以防需要扩展。我很可能会使用谷歌Pub/sub作为Pub-sub引擎,但我想如果我切换到卡夫卡,我也会有同样的问题。 我有几个问题: 如果我用Java编写我的消费者,会更好吗?(例如,它会更快吗?我是否需要更少地扩展用户脚本?) 我应该改用apachespark之类的东西作为消费者吗?我不喜欢为了“这么简单”的东西需要处理Spark的微批处理或dStrea

我只需要对每条消息进行最少的解析,即用逗号标记、转换为int并写入数据库

我打算以使用者的身份编写一个Python脚本,并在容器上运行该脚本,以防需要扩展。我很可能会使用谷歌Pub/sub作为Pub-sub引擎,但我想如果我切换到卡夫卡,我也会有同样的问题。 我有几个问题:

  • 如果我用Java编写我的消费者,会更好吗?(例如,它会更快吗?我是否需要更少地扩展用户脚本?)
  • 我应该改用apachespark之类的东西作为消费者吗?我不喜欢为了“这么简单”的东西需要处理Spark的微批处理或dStream RDD的想法
  • 作为消费者,我应该完全使用其他东西吗?(我对这些不太熟悉,但我听说过:卡夫卡溪流、阿帕奇风暴、弗林克、比姆)

  • 答案取决于您的负载、您当前和潜在的未来需求、您对各种工具和框架的熟悉程度等。 我将集中讨论卡夫卡,因为我对它很熟悉。GooglePub/Sub或Kinesis的语义相似,因此以下内容应该适用

    大约1)

    Json反序列化性能可能因语言而异,但它是一种内存操作。因此,我怀疑这将是你们管道中的瓶颈。 每种语言都有多个json编码器/解码器,这意味着在一种语言的工具系列中有优化的空间。 可以找到一个基于python的小型基准测试。 我的观点是,你不应该使用你不熟悉的语言;您可能会找到一个使用首选语言的性能解决方案

    在我不久前做的一个基准测试中,一个卡夫卡消费者在Flink上,用Scala编写,在AWS上,以~3K/s的速度从卡夫卡获取并反序列化Json消息(每个消息约1-2KB)。这是为了提供一个数量级的指示,您应该期望从每个并行过程。 这远远没有得到优化,我敢肯定,如果优化得当,这可能会高出一个数量级。 我想说的是,如果你收到的信息数在每秒100s/1Ks的范围内,你不必太担心。 您可以很容易地设置一个实验,例如,使用json消息 添加一个json反序列化步骤

    大约2,3)

    Spark Streaming与Flink和Storm的系统类型完全相同。它们是分布式流处理器,能够部署大型(有状态)流拓扑,并可扩展到100K-1M消息/秒。但是,它们需要部署在集群上(我通常选择Thread,但它可以是Mesos,也可以是独立的或Kubernetes等)。 对于您描述的用例来说,它们可能是一种过度的杀伤力

    在该组的使用者中均匀分布主题分区。如果一个使用者死亡,分配给它的分区将在其余使用者之间进行负载平衡。如果添加了另一个使用者,分区将重新平衡。消费者通过向卡夫卡承诺补偿来标记他们的进步,因此卡夫卡确切地知道在失败的情况下消费者会留在哪里。在某些情况下,已处理的偏移量将无法提交并因此重新处理(至少一次语义),但假设您的操作被设计为幂等的,您就可以了

    您可以设计一个解决方案,在该解决方案中,许多并行无状态Kafka使用者正在一组容器上处理和持久化消息,从而实现您的目标。
    我的印象是(正如@dawsaw提到的)太前沿了,但我可能错了。

    你看过《卡夫卡连接》吗?它可以进行简单的转换,并且已经有一些连接器可用于一些常见的数据库。这是一个最小的编码解决方案