CheckpointStore persistently stores mapping of timestamp to checkpoint it's possible that two checkpoints have the same timestamp CheckpointStore needs to handle this either during write or read
MessageDecoder decodes raw bytes to Message It is usually written by end user and passed into TimeReplayableSource
filter offsets and store the mapping from timestamp to offset
manages message's offset on TimeReplayableSource and timestamp
OffsetStorage stores the mapping from TimeStamp to Offset
resolve timestamp to offset by look up the underlying storage
AT-LEAST-ONCE API
TimeStampFilter filters message comparing its TimeStamp with the predicate.