-2

我正在寻找一种数据结构,其工作方式类似于具有一个分区的 Apache Kafka 主题:

  • 发件人将始终附加到日志的末尾
  • 每个附加的消息都会得到一个严格递增的偏移量
  • 消息至少保留给定的保留时间
  • 消费者可以在任何偏移量或最旧或最新的偏移量处开始消费
  • 消费消息不会删除它们

如果没有合适的现有结构,我将自己实现它,但我更愿意使用现有的东西。

4

2 回答 2

1

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

于 2019-01-02T10:36:10.583 回答
0

我能够基于 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);
    }

}
于 2019-01-02T10:28:26.423 回答