Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么样的java数据结构适用于基于偏移量的日志,如带有单个分区的kafka?_Java_Data Structures_Apache Kafka_Journaling - Fatal编程技术网

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

什么样的java数据结构适用于基于偏移量的日志,如带有单个分区的kafka?,java,data-structures,apache-kafka,journaling,Java,Data Structures,Apache Kafka,Journaling,我正在搜索一个数据结构,该结构的工作原理类似于一个分区的Apache Kafka主题: 发件人将始终附加到日志的末尾 每个附加的消息都会得到一个严格递增的偏移量 消息至少会保留一段给定的保留时间 消费者可以在任何偏移量或最旧或最新偏移量开始消费 消费邮件不会删除它们 如果没有合适的现有结构,我将自己实施,但我更愿意使用现有的结构。我能够基于ConcurrentNavigableMap找到合适的结构: import java.util.Iterator; import java.util.Ma

我正在搜索一个数据结构,该结构的工作原理类似于一个分区的Apache Kafka主题:

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

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

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

}
import java.util.Iterator;
导入java.util.Map.Entry;
导入java.util.concurrent.ConcurrentNavigableMap;
导入java.util.concurrent.ConcurrentSkipListMap;
导入java.util.concurrent.AtomicLong;
公共类期刊{
专用静态最终长初始_偏移=0;
私有AtomicLong nextofset=新的AtomicLong();
私有ConcurrentNavigableMap消息=新ConcurrentSkipListMap();
公共长附加(T消息){
长偏移量=nextofset.getAndIncrement();
messages.put(偏移量、消息);
返回偏移量;
}
公共长getFirstOffset(){
迭代器it=messages.keySet().Iterator();
return it.hasNext()?it.next():初始偏移量;
}
公共条目getNext(长偏移量){
返回此.messages.higherEntry(偏移量);
}
}

我认为没有这样的现有数据结构,您必须编写自定义逻辑,以便在一定时间后删除元素,据我所知,您可以使用任何集合的列表系列,只需很少的自定义。

我现在省略了保留,但它可以很容易地添加。我的主要问题是为期刊的主要职责找到合适的数据结构。顺便说一句,您可以在ConcurrentNavigableMap上找到我的完整代码,因为它可以覆盖大部分偏移量语义。当然,删除逻辑将是自定义代码。