Spring Kafka和auto ack超时

时间:2017-12-10 19:24:07

标签: apache-kafka spring-kafka

我使用Kafka消息代理和Spring Kafka。

我使用默认的自动确认模型。有时我的update.aspx.cs protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { using (datademoEntities db = new datademoEntities()) { var query = from tbl in db.demotables select new{tbl.Id, tbl.FirstName, tbl.gender, tbl.PhoneNumber, tbl.Role}; ddlupdate.DataSource = query.ToList(); ddlupdate.DataTextField = "FirstName"; ddlupdate.DataValueField = "id"; ddlupdate.DataBind(); ddlupdate.Items.Insert(0, new ListItem("select")); } } } static int did; protected void ddlupdate_SelectedIndexChanged(object sender, EventArgs e) { did = int.Parse(ddlupdate.SelectedValue); using (datademoEntities db = new datademoEntities()) { var query = (from tbl in db.demotables where tbl.Id == did select tbl).First(); txtname.Text = query.FirstName; rbgender.DataTextField = query.gender; txtphone.Text = query.PhoneNumber.ToString(); } } protected void btnupdate_Click(object sender, EventArgs e) { string dname = txtname.Text; int dphone = int.Parse(txtphone.Text); using (datademoEntities db = new datademoEntities()) { demotable tbl = (from row in db.demotables where row.Id==did select row).First(); tbl.FirstName = dname; tbl.PhoneNumber = dphone; db.SaveChanges(); Response.AddHeader("Refresh", "3;url.display.aspx"); } } } } display.aspx.cs public partial class display : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { datademoEntities db = new datademoEntities(); var query = (from tbl in db.demotables select tbl).ToList(); GridView1.DataSource = query; GridView1.DataBind(); } } } INSERT.apx.cs protected void btnsubmit_Click(object sender, EventArgs e) { datademoEntities dm = new datademoEntities(); string dname = txtname.Text; string drole = ddlrole.SelectedValue; string dphone = txtphone.Text; string dgender = rbgender.SelectedValue; demotable tbl = new demotable(); tbl.FirstName = dname; tbl.Role = drole; tbl.PhoneNumber = Convert.ToInt32(dphone); tbl.gender = dgender; dm.demotables.Add(tbl); dm.SaveChanges(); 需要约5分钟才能完成工作。

我注意到,当它发生时,Kafka会产生重复的消息。 是否有任何超时属性可以配置以防止Kafka重复相同的消息并让生产者等待(至少例如10分钟)而消费者将完成工作?

1 个答案:

答案 0 :(得分:2)

生产者和消费者脱钩 - 没有办法阻止生产者发送更多消息,因为消费者很慢。

  

我没有明确使用auto.com。我使用默认的Spring配置

默认情况下,

"main@1" prio=5 tid=0x1 nid=NA runnable java.lang.Thread.State: RUNNABLE at org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice.evaluateSuccessExpression(ExpressionEvaluatingRequestHandlerAdvice.java:241) at org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice.doInvoke(ExpressionEvaluatingRequestHandlerAdvice.java:214) at org.springframework.integration.handler.advice.AbstractRequestHandlerAdvice.invoke(AbstractRequestHandlerAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) at com.sun.proxy.$Proxy81.handleRequestMessage(Unknown Source:-1) at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.doInvokeAdvisedRequestHandler(AbstractReplyProducingMessageHandler.java:127) at org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:112) at org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:127) at org.springframework.integration.dispatcher.AbstractDispatcher.tryOptimizedDispatch(AbstractDispatcher.java:116) at org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:148) at org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:121) at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:89) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:115) at org.springframework.messaging.core.GenericMessagingTemplate.doSend(GenericMessagingTemplate.java:45) at org.springframework.messaging.core.AbstractMessageSendingTemplate.send(AbstractMessageSendingTemplate.java:105) at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:143) at org.springframework.messaging.core.AbstractMessageSendingTemplate.convertAndSend(AbstractMessageSendingTemplate.java:135) at org.springframework.integration.gateway.MessagingGatewaySupport.send(MessagingGatewaySupport.java:392) at org.springframework.integration.gateway.GatewayProxyFactoryBean.invokeGatewayMethod(GatewayProxyFactoryBean.java:481) at org.springframework.integration.gateway.GatewayProxyFactoryBean.doInvoke(GatewayProxyFactoryBean.java:433) at org.springframework.integration.gateway.GatewayProxyFactoryBean.invoke(GatewayProxyFactoryBean.java:424) at org.springframework.integration.gateway.GatewayCompletableFutureProxyFactoryBean.invoke(GatewayCompletableFutureProxyFactoryBean.java:65) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) at com.sun.proxy.$Proxy87.upload(Unknown Source:-1) auto.commit(在Kafka客户端中),因此spring下的默认行为是客户端执行自己的提交而不是容器。将其设置为true并将容器属性false设置为AckMode,以便在侦听器退出后执行提交。

kafka consumer property RECORD,默认为5分钟(300000)。

  

使用消费者群组管理时poll()调用之间的最大延迟。这为消费者在获取更多记录之前可以闲置的时间量设置了上限。如果在此超时到期之前未调用poll(),则认为使用者失败,并且该组将重新平衡以便将分区重新分配给另一个成员。

重新平衡将导致重新发送。您可以增加该属性以避免重新平衡。

正如我所说,日志通常有帮助;您应该会在日志中看到重新平衡。

相关问题