什么样的java数据结构适合于基于偏移量的日志,比如kafka的单分区日志?

3htmauhk  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(383)

我正在搜索一个数据结构,它的工作原理类似于一个分区的apache kafka主题:
发件人将始终附加到日记的末尾
每个附加的消息都得到一个严格递增的偏移量
消息至少会保留一段给定的保留时间
消费者可以开始消费任何抵消或最旧或最新的抵消
使用消息不会删除它们
如果没有合适的现有结构,我将实现它自己,但我宁愿使用现有的东西。

jv4diomz

jv4diomz1#

我基于concurrentnavigablemap找到了一个合适的结构:

import java.util.Iterator;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentNavigableMap;
import java.util.concurrent.ConcurrentSkipListMap;
import java.util.concurrent.atomic.AtomicLong;

public class Journal<T> {
    private static final long INITIAL_OFFSET = 0;
    private AtomicLong nextOffset = new AtomicLong();
    private ConcurrentNavigableMap<Long, T> messages = new ConcurrentSkipListMap<>();

    public long append(T message) {
        Long offset = nextOffset.getAndIncrement();
        messages.put(offset, message);
        return offset;
    }

    public long getFirstOffset() {
        Iterator<Long> it = messages.keySet().iterator();
        return it.hasNext() ? it.next() : INITIAL_OFFSET;
    }

    public Entry<Long, T> getNext(long offset) {
        return this.messages.higherEntry(offset);
    }

}
gudnpqoy

gudnpqoy2#

我认为没有这样的现有数据结构,您必须编写自定义逻辑,以便在一定时间后删除元素,根据我的理解,您可以使用任何列表系列的集合,而无需进行任何自定义。

相关问题