Какая структура данных Java подходит для журнала на основе смещений, такого как kafka с одним разделом? - PullRequest
0 голосов
/ 02 января 2019

Я ищу структуру данных, которая работает аналогично теме Apache Kafka с одним разделом:

  • Отправитель всегда добавляется в конец журнала
  • Каждый добавляетсясообщение получает строго возрастающее увеличивающееся смещение
  • Сообщения сохраняются в течение как минимум заданного времени хранения
  • Потребители могут начать потреблять с любого смещения или с самым старым или самым новым смещением
  • Использование сообщений не приведет к их удалению

Если не существует подходящей существующей структуры, я сам ее реализую, но предпочел бы использовать что-то существующее.

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Я думаю, что такой существующей структуры данных не существует, вы должны написать собственную логику для удаления элемента через определенное время, согласно моему пониманию, вы можете использовать любое семейство списков с небольшими изменениями.

0 голосов
/ 02 января 2019

Мне удалось найти подходящую структуру на основе 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);
    }

}
...