Spring Kafka-什么时候引用引擎盖后面的Consumer.poll()?

时间:2018-05-09 02:39:25

标签: java apache-kafka spring-kafka

我有一个春季启动应用程序,其中我有单个Kafka Consumer。

我使用DefaultKafkaConsumerFactory和默认的Consumer Configurations。我有一个并发设置为1的ConcurrentListenerContainerFactory,我有一个用@KafkaListener注释的方法。

我正在听一个包含3个分区的主题,我在不同的应用程序中部署了3个这样的消费者。因此,每个消费者都在听一个分区。

让我们说消费者的民意调查是在引擎盖下进行的,并且提取了40条记录。然后是每个记录,提供给用@KafkaListener连续注释的方法,即提供的记录1,等待方法完成处理,提供记录2,等待方法完成处理等等。 如果发生上述情况,或者对于获得的每条记录,都会创建一个单独的线程,并且方法调用发生在一个单独的线程上,因此主线程不会阻塞,并且可以更快地轮询记录。

我还想更清楚一下消息监听器容器是什么以及最终的消息监听器。

提前谢谢你。

2 个答案:

答案 0 :(得分:1)

在1.3及以上版本中,每个消费者只有一个帖子;在侦听器处理了上一轮询的最后一条消息之后执行下一个poll()

在早期版本中,有两个线程,并且在侦听器线程处理第一个批处理时执行了第二个(可能是第三个)轮询。这是为了避免由于监听器缓慢导致的重新平衡。线程模型非常复杂,我们必须在必要时暂停/恢复消费者。 KIP-62修复了重新平衡问题,因此我们能够使用今天使用的更简单的线程模型。

答案 1 :(得分:1)

嗯,这正是Apache Kafka的位置 - 保证订单处理来自同一线程中同一分区的记录。因此,当您在3个实例之间分配3个分区的主题时,每个实例都将获得自己的分区并在单个线程中进行轮询。

query-timeout是一个围绕 <script> var last_clicked_id = null; $('#LBENEF').DataTable({ rowId: 'ID', "aaSorting": [], "processing": true, "serverSide": true, "ajax": "/MaPage.asmx/GetListBenef", "columnDefs": [{ "orderable": false, "targets": 6 }], "columns": [ { "data": null, }, { "data": "TypeLibelle", }, { "data": "ID_CLIENT" }, { "data": "NomPrenom" }, { "data": "SitLibelle" }, { "data": "PerimLibelle" }, { "data": null } ], "createdRow": function (row, data, index) { if (!data.Actif) { $('td', row).eq(0).html("<span Class='glyphicon glyphicon-ban-circle'></span>"); } else { $('td', row).eq(0).html(""); } if (data.PeutConsult) { $('td', row).eq(6).html('<a href="/BENEFICIAIRE/edit.aspx?ID=' + data.ID + '"><span Class="glyphicon glyphicon-pencil"></span></a>'); } if (data.PeutSup) { $('td', row).eq(6).append('<a onclick="last_clicked_id=' + data.ID + ';" data-toggle="confirmation" href="#"><span class="glyphicon glyphicon-trash"></span></a>'); } }, drawCallback: function (oSettings) { paramPopOverFileList["onConfirm"] = function (event, element) { DelBenef(); }; $('[data-toggle="confirmation"]').confirmation(paramPopOverFileList); } }); function DelBenef() { $.ajax( { type: "POST", url: "/MaPage.asmx/DelBenef", contentType: "application/json; charset=utf-8", dataType: "json", data: '{"IdBenef":' + last_clicked_id + "}", success: function (msg) { if (msg.d.Reussi) { $('#LBENEF').DataTable().ajax.reload(); } else { AfficheMsgRetour(msg.d); } }, error: function () { AfficheMsgRetour({ Titre: "Désactivation bénéficiaire", Reussi: false, Msg: "Erreur accès fonction" }); } }); } </script> 的事件驱动的自我控制包装器。它确实在KafkaMessageListenerContainer循环中调用KafkaConsumer,该循环计划在poll()中:

while (isRunning()) {

它处理TaskExecutor调用侦听器:

this.listenerConsumerFuture = containerProperties
            .getConsumerTaskExecutor()
            .submitListenable(this.listenerConsumer);