Об этом проекте

Fila — это брокер сообщений, находящийся на стадии проектирования (рабочего кода пока нет). Он решает распространённую проблему традиционных FIFO-брокеров: когда несколько арендаторов или типов рабочих нагрузок совместно используют одну очередь, один шумный продюсер может лишить ресурсов всех остальных, а ограничение скорости обычно перекладывается на потребителя, что приводит к бесполезной работе и дополнительной задержке. Fila переносит решения о планировании в сам брокер. Ключевые возможности: - **Справедливое планирование Deficit Round Robin (DRR)**: каждый ключ справедливости получает пропорциональную долю пропускной способности доставки в соответствии с весом, что предотвращает голодание арендаторов. - **Throttling, объявляемый потребителем**: потребители объявляют именованные ограничения скорости (например, на сервис или на клиента) при подписке. Брокер удерживает сообщения, пока доставка не укладывается во все объявленные лимиты, поэтому потребители получают только те сообщения, которые действительно могут обработать. - **Движок правил на Lua**: необязательные хуки `on_enqueue` и `on_failure` позволяют пользователям определять собственную политику планирования, например выводить ключи справедливости из полезной нагрузки или решать, выполнять повторную попытку или отправлять в dead-letter. - **Дедупликация и упорядочивание**: обе функции по умолчанию отключены, настраиваются через ключи идемпотентности и ключи упорядочивания соответственно. - **Повторные попытки и очереди недоставленных сообщений**: неудачные попытки запускают настраиваемые политики повторных попыток (по умолчанию 3 попытки с экспоненциальной задержкой), а исчерпавшие попытки сообщения перемещаются в DLQ для каждой очереди, поддерживающую redrive. - **Аренды (leases)**: доставленные сообщения арендуются с тайм-аутами видимости; истёкшие аренды считаются неудачными попытками. - **Конфигурация во время выполнения**: живое хранилище ключ-значение, доступное для чтения из хуков Lua, позволяющее менять политику без перезапуска. Клиентский SDK написан на Rust и использует модель разрешений на основе возможностей с тремя дескрипторами (producer, consumer, admin), которые отражают разрешения ACL. Сетевой протокол — самодельный бинарный протокол (без gRPC), изначально пакетный и мультиплексируемый через одно соединение. Клиент следует архитектуре sans-io, разделяя чистое ядро-конечный автомат и языково-специфичную оболочку ввода-вывода, чтобы обеспечить будущие мультиязычные SDK. CLI (`fila`) — это тонкий клиент поверх того же SDK без привилегированного доступа, охватывающий управление очередями, операции кластера (drain, move, rebalance), конфигурацию во время выполнения, redrive и администрирование auth/ACL. Хранилище начинается с append-only лога и индекса в памяти, с контрактом трейта хранилища, подчёркивающим долговечность до подтверждения, атомарные группы мутаций и упорядоченные сканирования диапазонов. Кластеризация использует группы Raft для каждой очереди с мета-группой для координации. Лицензировано под AGPLv3.