On Thu, Feb 2, 2017 at 11:21 PM, James Cheng <wushuja...@gmail.com> wrote:
> Ewen, > > Ah right, that's a good point. > > My initial reaction to your examples was that "well, those should be in > separate topics", but then I realized that people choose their topics for a > variety of reasons. Sometimes they organize it based on their producers, > sometimes they organize it based on the nature of the data, but sometimes > (as you gave examples about), they may organize it based on the consuming > application. And there are valid reason to want different data types in a > single topic: > > 1) You get global ordering > 2) You get persistent ordering in the case of re-reads (where as reading 2 > topics would cause different ordering upon re-reads.) > 3) Logically-related data types all co-located. > > I do still think it'd be convenient to only have to set > min.insync.replicas on a topic and not have to require producing > applications to also set acks=all. It'd then be a single thing you have to > configure, instead of the current 2 things. (since, as currently > implemented, you have to set both things, in order to achieve high > durability.) > I entirely agree, I think the default should be acks=all and then this would be true :) Similar to the unclean leader election setting, I think defaulting to durable by default is a better choice. I understand historically why a different choice was made (Kafka didn't start out as a replicated, durable storage system), but given how it has evolved I think durable by default would be a better choice on both the broker and producer. > > But I admit that it's hard to find the balance of > features/simplicity/complexity, > to handle all the use cases. > Perhaps the KIP-106 adjustment to unclean leader election could benefit from a sister KIP for adjusting the default producer acks setting? Not sure how popular it would be, but I would be in favor. -Ewen > > Thanks, > -James > > > On Feb 2, 2017, at 9:42 PM, Ewen Cheslack-Postava <e...@confluent.io> > wrote: > > > > James, > > > > Great question, I probably should have been clearer. log data is an > example > > where the app (or even instance of the app) might know best what the > right > > tradeoff is. Depending on your strategy for managing logs, you may or may > > not be mixing multiple logs (and logs from different deployments) into > the > > same topic. For example, if you key by application, then you have an easy > > way to split logs up while still getting a global feed of log messages. > > Maybe logs from one app are really critical and we want to retry, but > from > > another app are just a nice to have. > > > > There are other examples even within a single app. For example, a gaming > > company might report data from a user of a game to the same topic but > want > > 2 producers with different reliability levels (and possibly where the > > ordering constraints across the two sets that might otherwise cause you > to > > use a single consumer are not an issue). High frequency telemetry on a > > player might be desirable to have, but not the end of the world if some > is > > lost. In contrast, they may want a stronger guarantee for, e.g., sometime > > like chat messages, where they want to have a permanent record of them in > > all circumstances. > > > > -Ewen > > > > On Fri, Jan 27, 2017 at 12:59 AM, James Cheng <wushuja...@gmail.com> > wrote: > > > >> > >>> On Jan 27, 2017, at 12:18 AM, Ewen Cheslack-Postava <e...@confluent.io > > > >> wrote: > >>> > >>> On Thu, Jan 26, 2017 at 4:23 PM, Luciano Afranllie < > >> listas.luaf...@gmail.com > >>>> wrote: > >>> > >>>> I was thinking about the situation where you have less brokers in the > >> ISR > >>>> list than the number set in min.insync.replicas. > >>>> > >>>> My idea was that if I, as an administrator, for a given topic, want to > >>>> favor durability over availability, then if that topic has less ISR > than > >>>> the value set in min.insync.replicas I may want to stop producing to > the > >>>> topic. In the way min.insync.replicas and ack work, I need to > coordinate > >>>> with all producers in order to achieve this. There is no way (or I > don't > >>>> know it) to globally enforce stop producing to a topic if it is under > >>>> replicated. > >>>> > >>>> I don't see why, for the same topic, some producers might want get an > >> error > >>>> when the number of ISR is below min.insync.replicas while other > >> producers > >>>> don't. I think it could be more useful to be able to set that ALL > >> producers > >>>> should get an error when a given topic is under replicated so they > stop > >>>> producing, than for a single producer to get an error when ANY topic > is > >>>> under replicated. I don't have a lot of experience with Kafka so I may > >> be > >>>> missing some use cases. > >>>> > >>> > >>> It's also a matter of not having to do a ton of configuration on a > >>> per-topic basis. Putting some control in the producer apps hands means > >> you > >>> can set reasonably global defaults which make sense for apps that > require > >>> stronger durability while letting cases that have lower requirements > >> still > >>> benefit from the durability before consumers see data but not block > >>> producers because the producer chooses lower requirements. WIthout > >>> requiring the ability to make config changes on the Kafka brokers > (which > >>> may be locked down and restricted only to Kafka admins), the producer > >>> application can choose to accept weaker guarantees based on the > tradeoffs > >>> it needs to make. > >>> > >> > >> I'm not sure I follow, Ewen. > >> > >> I do agree that if I set min.insync.replicas at a broker level, then of > >> course I would like individual producers to decide whether their topic > >> (which inherits from the global setting) should reject writes if that > topic > >> has size(ISR)<min.insync.replicas. > >> > >> But on a topic-level... are you saying that if a particular topic has > >> min.insync.replicas set, that you want producers to have the > flexibility to > >> decide on whether they want durability vs availability? > >> > >> Often times (but not always), a particular topic is used only by a small > >> set of producers with a specific set of data. The durability settings > would > >> usually be chosen due to the nature of the data, rather than based on > who > >> produced the data, and so it makes sense to me that the durability > should > >> be on the entire topic, not by the producer. > >> > >> What is a use case where you have multiple producers writing to the same > >> topic but would want different durability? > >> > >> -James > >> > >>> The ability to make this tradeoff in different places can seem more > >> complex > >>> (and really by definition *is* more complex), but it also offers more > >>> flexibility. > >>> > >>> -Ewen > >>> > >>> > >>>> But I understand your point, min.insync.replicas setting should be > >>>> understood as "if a producer wants to get an error when topics are > under > >>>> replicated, then how many replicas are enough for not raising an > error?" > >>>> > >>>> > >>>> On Thu, Jan 26, 2017 at 4:16 PM, Ewen Cheslack-Postava < > >> e...@confluent.io> > >>>> wrote: > >>>> > >>>>> The acks setting for the producer doesn't affect the final durability > >>>>> guarantees. These are still enforced by the replication and min ISR > >>>>> settings. Instead, the ack setting just lets the producer control how > >>>>> durable the write is before *that producer* can consider the write > >>>>> "complete", i.e. before it gets an ack. > >>>>> > >>>>> -Ewen > >>>>> > >>>>> On Tue, Jan 24, 2017 at 12:46 PM, Luciano Afranllie < > >>>>> listas.luaf...@gmail.com> wrote: > >>>>> > >>>>>> Hi everybody > >>>>>> > >>>>>> I am trying to understand why Kafka let each individual producer, > on a > >>>>>> connection per connection basis, choose the tradeoff between > >>>> availability > >>>>>> and durability, honoring min.insync.replicas value only if producer > >>>> uses > >>>>>> ack=all. > >>>>>> > >>>>>> I mean, for a single topic, cluster administrators can't enforce > >>>> messages > >>>>>> to be stores in a minimum number of replicas without coordinating > with > >>>>> all > >>>>>> producers to that topic so all of them use ack=all. > >>>>>> > >>>>>> Is there something that I am missing? Is there any other strategy to > >>>>>> overcome this situation? > >>>>>> > >>>>>> Regards > >>>>>> Luciano > >>>>>> > >>>>> > >>>> > >> > >> > >