Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Аренды
Экземпляры сервиса делят сегменты потока через таблицу аренд: одна строка на сегмент с владельцем, сроком действия и контрольной точкой.
Схема текстом
- Таблица аренд: orders:shardId-000000000000 владелец A, срок, счётчик, контрольная точка; orders:shardId-000000000001 владелец B, срок, счётчик, контрольная точка
- Экземпляр A держит сегмент 0 → orders:shardId-000000000000 владелец A, срок, счётчик, контрольная точка: продлевает каждые 3 с
- Экземпляр B держит сегмент 1 → orders:shardId-000000000001 владелец B, срок, счётчик, контрольная точка: продлевает каждые 3 с
- Когда A останавливается, его аренда истекает через 10 с. B забирает строку условной записью и продолжает после контрольной точки, которую записал A
Kinesis не хранит сведений о том, кто читает сегмент и как далеко он продвинулся. Kinesis Client
Library хранит их в таблице DynamoDB, по строке на сегмент, и её рабочие процессы забирают строки,
которые никто не продлевает. Этот крейт делает то же самое через
LeaseStore. Хранилище берёт сегмент для владельца,
продлевает аренду, записывает контрольную точку, читает строку и освобождает её. Ключ каждой
строки - поток и сегмент вместе, потому что идентификаторы сегментов повторяются в разных потоках.
Аренда действует 10 секунд, и читатель продлевает её каждые 3 секунды. Если продление не удалось, сегмент перешёл к другому владельцу, и читатель сразу останавливается, не записывая контрольную точку. Новый владелец читает с последней контрольной точки, поэтому несколько записей могут быть доставлены дважды. Гарантия доставки - at-least-once.
DynamoLeaseStore с фичей dynamodb-lease хранит
строки в таблице DynamoDB с одним строковым ключом lease_key, записанным как stream:shard.
Строка содержит lease_owner, lease_expiry, lease_counter и checkpoint. Каждая операция
записи условная. Захват удаётся, если у строки нет владельца, владелец - этот же или срок аренды
истёк. Продление, запись контрольной точки и освобождение удаются, только пока строку держит этот
владелец. Чтение строго согласованное. У каждого брокера собственный идентификатор владельца
аренды, по умолчанию уникальный, поэтому два экземпляра никогда не держат один сегмент вместе.
MemoryLeaseStore используется по умолчанию. Он
хранится в процессе: подходит для одного экземпляра и снова пуст после перезапуска. У
перезапущенного сервиса тогда нет контрольных точек, и каждый сегмент открывается с конца потока,
если start_at(..) не задаёт другую позицию.
Хранилище принадлежит одному брокеру. Брокер читает поток через одну подписку, а вторая подписка на тот же поток отвергается при старте. Два брокера с собственными хранилищами аренд, в одном сервисе или в двух, каждый читают весь поток. Экземпляры с одной общей таблицей делят сегменты.
Эта модель взята у таблицы аренд Kinesis Client Library (потребители KCL) с условными записями DynamoDB (условные выражения).