Thanks Jiangjie. This is helpful. Adding to what you have mentioned, I can think of one more scenario which may not be very rare. Say, the application is rebooted and the Kafka brokers registered in the producer are not reachable ( could be due to network issues or those brokers are actually down ). Since, no metadata is available the send will block. Right?
On Wed, May 13, 2015 at 10:51 AM, Jiangjie Qin <j...@linkedin.com.invalid> wrote: > > Application will not block on each metadata refresh or metadata is > expired. > Application will only be blocked when > 1. It sends the first message to a topic (only for that single message), or > 2. The topic has been deleted from broker thus refreshed metadata loses > the topic info (which is pretty rare). > > So I think the async here might mean a little bit different. It means when > you send first message to a topic, you wait till you know the topic exist, > after that point it is async. > It is very low chance that your application will block on send. If it is > then something probably really went wrong and needs immediate attention. > > Thanks. > > Jiangjie (Becket) Qin > > On 5/12/15, 5:08 PM, "Rendy Bambang Junior" <rendy.b.jun...@gmail.com> > wrote: > > >Thank you for the clarification. > > > >I think I agree with Mohit. Sometime blocking on logging is not acceptable > >by nature of application who uses kafka. > > > >Yes it is not blocking when metadata is still available. But application > >will be blocked once metada is expired. > > > >It might be handled by application, by implementing async call when do > >send() and manage buffer and async timeout internally, but it makes async > >feature in kafka producer has less meaning. > > > >Sorry if my understanding is incorrect. > > > >Rendy > >On May 13, 2015 6:59 AM, "Jiangjie Qin" <j...@linkedin.com.invalid> > wrote: > > > >> Send() will only block if the metadata is *not available* for the topic. > >> It won't block if metadata there is stale. The metadata refresh is async > >> to send(). However, if you send the message to a topic for the first > >>time, > >> send() will trigger a metadata refresh and block until it has metadata > >>for > >> that topic. > >> > >> Jiangjie (Becket) Qin > >> > >> On 5/12/15, 12:58 PM, "Magnus Edenhill" <mag...@edenhill.se> wrote: > >> > >> >I completely agree with Mohit, an application should not have to know > >>or > >> >care about > >> >producer implementation internals. > >> >Given a message and its delivery constraints (produce retry count and > >> >timeout) the producer > >> >should hide any temporal failures until the message is succesfully > >> >delivered, a permanent > >> >error is encountered or the constraints are hit. > >> >This should also include internal start up sequencing, such as metadata > >> >retrieval. > >> > > >> > > >> > > >> >2015-05-12 21:22 GMT+02:00 Mohit Gupta <success.mohit.gu...@gmail.com > >: > >> > > >> >> I could not follow the reasoning behind blocking the send method if > >>the > >> >> metadata is not up-to-date. Though, I see that it as per design, it > >> >> requires the metadata to batch the message into appropriate > >> >>topicPartition > >> >> queue. Also, if the metadata could not be updated in the specified > >> >> interval, it throws an exception and the message is not queued to be > >> >> retried once the brokers are up. > >> >> > >> >> Should it not be that messages are buffered in another queue ( up-to > >>a > >> >> limit ) if the brokers are down and retried later? > >> >> Is it not a general use case to require producer to be asynchronous > >>in > >> >>all > >> >> the scenarios? > >> >> > >> >> > >> >> On Tue, May 12, 2015 at 10:54 PM, Mayuresh Gharat < > >> >> gharatmayures...@gmail.com> wrote: > >> >> > >> >> > The way it works I suppose is that, the producer will do > >> >>fetchMetadata, > >> >> if > >> >> > the last fetched metadata is stale (the refresh interval has > >>expired) > >> >>or > >> >> if > >> >> > it is not able to send data to a particular broker in its current > >> >> metadata > >> >> > (This might happen in some cases like if the leader moves). > >> >> > > >> >> > It cannot produce without having the right metadata. > >> >> > > >> >> > Thanks, > >> >> > > >> >> > Mayuresh > >> >> > > >> >> > On Tue, May 12, 2015 at 10:09 AM, Jiangjie Qin > >> >><j...@linkedin.com.invalid > >> >> > > >> >> > wrote: > >> >> > > >> >> > > That¹s right. Send() will first try to get metadata of a topic, > >>that > >> >> is a > >> >> > > blocking operation. > >> >> > > > >> >> > > On 5/12/15, 2:48 AM, "Rendy Bambang Junior" > >> >><rendy.b.jun...@gmail.com> > >> >> > > wrote: > >> >> > > > >> >> > > >Hi, sorry if my understanding is incorrect. > >> >> > > > > >> >> > > >I am integrating kafka producer with application, when i try to > >> >> shutdown > >> >> > > >all kafka broker (preparing for prod env) I notice that 'send' > >> >>method > >> >> is > >> >> > > >blocking. > >> >> > > > > >> >> > > >Is new producer fetch metadata not async? > >> >> > > > > >> >> > > >Rendy > >> >> > > > >> >> > > > >> >> > > >> >> > > >> >> > -- > >> >> > -Regards, > >> >> > Mayuresh R. Gharat > >> >> > (862) 250-7125 > >> >> > > >> >> > >> >> > >> >> > >> >> -- > >> >> Best Regards, > >> >> > >> >> Mohit Gupta > >> >> > >> > >> > > -- Best Regards, Mohit Gupta