https://github.com/zikwall/grower_
Grover is my experience of creating a system for collecting events, logs, etc. similar to Kafka (producers, consumers with group, topics, partitions)
https://github.com/zikwall/grower_
go golang
Last synced: 9 months ago
JSON representation
Grover is my experience of creating a system for collecting events, logs, etc. similar to Kafka (producers, consumers with group, topics, partitions)
- Host: GitHub
- URL: https://github.com/zikwall/grower_
- Owner: zikwall
- Created: 2021-09-09T10:04:21.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2021-09-25T08:13:52.000Z (almost 5 years ago)
- Last Synced: 2025-01-05T14:24:39.284Z (over 1 year ago)
- Topics: go, golang
- Language: Go
- Homepage:
- Size: 64.5 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
## Grower
### Задумки
- Партиции хранить в директориях топиков
- Партиции разделить на сегменты (по весу или по количеству сообщений), каждый сегмент хранить в директории партиции
- Подумать и реализовать политику хранения сегментов, например, удалять все сегменты старше 5 дней или когда сумма сегментов превышает 100k или размер превышает 1ГБ удалять первые пришедшие (FIFO)
- Сегменты нумеровать так 0-10 сообщений 00000000000.growerlog и 10-20 сообщений 00000000010.growerlog
- Добавить индексные файлы к сегментам с офсетами и позициями байтов, формат сегмента:
```log
offset | position
1 | 0
2 | 45
```
- Для быстрого поиска и чтения использовать индексный файл по аналогии с логами (00000000000.growerindex, 00000000010.growerindex) с бинарным поиском, затем делать побайтовое смещение типа Seek
- При записи нужно будет сохранять смещение каждой записи (начало смещения)
- Подумать над gRPC для клиентов
- zero copy disk -> socket
### Общая схема работы
```shell
// create two topics with 3 and 2 partitions
$ create topics -> rainbow(3), sanbox(2)
// producer 18 messages write to rainbow topic
$ producer -> (rainbow, 'Hello, Kitty 0!')
$ producer -> (rainbow, 'Hello, Kitty 1!')
$ producer -> (rainbow, 'Hello, Kitty 2!')
$ ...
$ producer -> (rainbow, 'Hello, Kitty 10!')
// describe topic in this moment, partition size max is 3 message
$ desc topic rainbow
-- /rainbow
-- /0
-- 00.growerlog ['Hello, Kitty 0!', 'Hello, Kitty 3!', 'Hello, Kitty 6!']
-- 00.growerindex
-- 03.growerlog ['Hello, Kitty 9!', 'Hello, Kitty 12!', 'Hello, Kitty 15!']
-- 03.growerindex
-- /1
-- 00.growerlog ['Hello, Kitty 1!', 'Hello, Kitty 4!', 'Hello, Kitty 7!']
-- 00.growerindex
-- 03.growerlog ['Hello, Kitty 10!', 'Hello, Kitty 13!', 'Hello, Kitty 16!']
-- 03.growerindex
-- /2
-- 00.growerlog ['Hello, Kitty 2!', 'Hello, Kitty 5!', 'Hello, Kitty 8!']
-- 00.growerindex
-- 03.growerlog ['Hello, Kitty 11!', 'Hello, Kitty 14!', 'Hello, Kitty 17!']
-- 03.growerindex
```
```shell
$ S1 = subscribe -> rainbow
$ S2 = subscribe -> rainbow
// S1 linked partitions [0, 1]
// S2 linked partitions [2]
// batch size 3
$ S1 -> read [ all from 0 and 1 partitions ]
$ S2 -> read [ all from last partition ]
```