我有一个春季启动应用程序,其中我有单个Kafka Consumer。
我使用DefaultKafkaConsumerFactory和默认的Consumer Configurations。我有一个并发设置为1的ConcurrentListenerContainerFactory,我有一个用@KafkaListener注释的方法。
我正在听一个包含3个分区的主题,我在不同的应用程序中部署了3个这样的消费者。因此,每个消费者都在听一个分区。
让我们说消费者的民意调查是在引擎盖下进行的,并且提取了40条记录。然后是每个记录,提供给用@KafkaListener连续注释的方法,即提供的记录1,等待方法完成处理,提供记录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);