Hi all, I've updated KIP with few more details: Added (proposed) Changes in binary message format <https://cwiki.apache.org/confluence/display/KAFKA/KIP-228+Negative+record+timestamp+support#KIP-228Negativerecordtimestampsupport-Changesinbinarymessageformat> Added Changes from producer perspective <https://cwiki.apache.org/confluence/display/KAFKA/KIP-228+Negative+record+timestamp+support#KIP-228Negativerecordtimestampsupport-Changesfromproducerperspective> Added Changes from consumer perspective <https://cwiki.apache.org/confluence/display/KAFKA/KIP-228+Negative+record+timestamp+support#KIP-228Negativerecordtimestampsupport-Changesfromconsumerperspective>
Let me know if it makes sense to you. -Konstantin > On Dec 7, 2017, at 2:46 PM, Konstantin Chukhlomin <chuhlo...@gmail.com> wrote: > > Hi Matthias, > > Indeed for consumers it will be not obvious what −1 means: actual timestamp > or no timestamp. Nevertheless, it's just −1 millisecond, so I thought it will > be > not a big deal to leave it (not clean, but acceptable). > > I agree that it will much cleaner to have a different type of topics that > support > negative timestamp and/or threat Long.MIN_VALUE as a no-timestamp. > I'll update KIP to make it a proposed solution. > > Thanks, > Konstantin > >> On Dec 5, 2017, at 7:06 PM, Matthias J. Sax <matth...@confluent.io> wrote: >> >> Thanks for the KIP Konstantin. >> >> From my understanding, you propose to just remove the negative timestamp >> check in KafkaProducer and KafkaStreams. If topics are configured with >> `CreateTime` brokers also write negative timestamps if they are embedded >> in the message. >> >> However, I am not sure about the overlapping semantics for -1 timestamp. >> My concerns is, that this ambiguity might result in issues. Assume that >> there is a topic (configured with `CreateTime`) for which an old and a >> new producer are writing. The old producer uses old message format and >> does not include any timestamp in the message. The broker will "upgrade" >> this message to the new format and set -1. At the same time, the new >> producer could write a message with valid timestamp -1. A consumer could >> not distinguish between both cases... >> >> Also, there might be other Producer implementations that write negative >> timestamps. Thus, those might already exist. For Streams, we don't >> process those and we should make sure to keep it this way (to avoid >> ambiguity). >> >> Thus, it might actually make sense to introduce a new timestamp type to >> express those new semantics. The question is still, how to deal with >> older producer clients that want to write to those topics. >> >> - We could either use `Long.MIN_VALUE` as "unknown" (this would be way >> better than -1 as it's not in the middle of the range but at the very >> end and it will also have well-defined semantics). >> - Or we use a "mixed-mode" where we use broker wall-clock time for >> older message formats (ie, append time semantics for older producers) >> - Third, we would even give an error message back to older producers; >> this might change the backward compatibility guarantees Kafka provides >> so far when upgrading brokers. However, this would not affect exiting >> topics, but only newly created ones (and we could disallow changing the >> semantics to the new timestamp type to guard against miss >> configuration). Thus, it might be ok. >> >> For Streams, we could check the topic config and process negative >> timestamps only if the topic is configures with the new timestamp type. >> >> >> Maybe I am a little bit to paranoid about overloading -1 semantics. >> Curious to get feedback from others. >> >> >> >> -Matthias >> >> >> On 12/5/17 1:24 PM, Konstantin Chukhlomin wrote: >>> Hi Dong, >>> >>> Currently we are storing historical timestamp in the message. >>> >>> What we are trying to achieve is to make it possible to do Kafka lookup >>> by timestamp. Ideally I would do `offsetsForTimes` to find articles >>> published >>> in 1910s (if we are storing articles on the log). >>> >>> So first two suggestions aren't really covering our use-case. >>> >>> We could create a new timestamp type like "HistoricalTimestamp" or >>> "MaybeNegativeTimestamp". >>> And the only difference between this one and CreateTime is that it could be >>> negative. >>> I tend to use CreateTime for this purpose because it's easier to understand >>> from >>> user perspective as a timestamp which publisher can set. >>> >>> Thanks, >>> Konstantin >>> >>>> On Dec 5, 2017, at 3:47 PM, Dong Lin <lindon...@gmail.com> wrote: >>>> >>>> Hey Konstantin, >>>> >>>> Thanks for the KIP. I have a few questions below. >>>> >>>> Strictly speaking Kafka actually allows you to store historical data. And >>>> user are free to encode arbitrary timestamp field in their Kafka message. >>>> For example, your Kafka message can currently have Json or Avro format and >>>> you can put a timestamp field there. Do you think that could address your >>>> use-case? >>>> >>>> Alternatively, KIP-82 introduced Record Header in Kafka and you can also >>>> define your customized key/value pair in the header. Do you think this can >>>> address your use-case? >>>> >>>> Also, currently there are two types of timestamp according to KIP-32. If >>>> the type is LogAppendTime then the timestamp value is the time when broker >>>> receives the message. If the type is CreateTime then the timestamp value is >>>> determined when producer produces message. With these two definitions, the >>>> timestamp should always be positive. We probably need a new type here if we >>>> can not put timestamp in the Record Header or the message payload. Does >>>> this sound reasonable? >>>> >>>> Thanks, >>>> Dong >>>> >>>> >>>> >>>> On Tue, Dec 5, 2017 at 8:40 AM, Konstantin Chukhlomin <chuhlo...@gmail.com> >>>> wrote: >>>> >>>>> Hi all, >>>>> >>>>> I have created a KIP to support negative timestamp: >>>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP- >>>>> 228+Negative+record+timestamp+support <https://cwiki.apache.org/ >>>>> confluence/display/KAFKA/KIP-228+Negative+record+timestamp+support> >>>>> >>>>> Here are proposed changes: https://github.com/apache/ >>>>> kafka/compare/trunk...chuhlomin:trunk <https://github.com/apache/ >>>>> kafka/compare/trunk...chuhlomin:trunk> >>>>> >>>>> I'm pretty sure that not cases are covered, so comments and suggestions >>>>> are welcome. >>>>> >>>>> Thank you, >>>>> Konstantin >>> >> >