Python SDK
Пакет runnev — официальный Python-SDK. Только стандартная библиотека, без зависимостей
во время выполнения, Python 3.9+. Публикация синхронна; подписка — это генератор, который можно
итерировать или запускать в потоке.
Установка
bash
pip install runnev # 1.5.3Настройка
python
import os
from runnev import Runnev
runnev = Runnev(
api_key=os.environ["RUNNEV_API_KEY"], # обязательно
base_url="https://runnev.dev/v1", # по умолчанию
timeout=30.0, # секунды на запрос
max_retries=4, # повторы при 429 / 5xx
)Публикация
python
stream = runnev.create_stream(name="orders-eu", retention_seconds=86400)
# явный номер — идемпотентно, безопасно повторять
res = runnev.publish(stream.id, 41823, [
{"type": "order.paid", "id": "o_5521", "amount": 1999},
])
print(res.cursor, res.duplicate) # 41823 False
# серверный номер
runnev.publish_auto(stream.id, [{"type": "tick"}])
# сырые байты для потока в режиме raw
runnev.publish_raw(stream.id, 9001, protobuf_bytes)Подписка
subscribe отдаёт объекты Batch и переподключается автоматически,
возобновляя с последнего номера.
python
for batch in runnev.subscribe(stream.id, cursor=0):
print(batch.seq, batch.events)Чтобы запустить её в фоне и корректно остановить из другого потока, используйте форму контекст-менеджера:
python
with runnev.subscribe(stream.id, cursor="head") as sub:
for batch in sub:
handle(batch)
if should_stop():
sub.close() # быстро прерывает циклВозобновление между перезапусками
python
last = load_cursor() # -1, если нет
for batch in runnev.subscribe(stream.id, cursor=last):
if batch.seq <= last: # дедуп «не менее одного раза»
continue
handle(batch)
last = batch.seq
save_cursor(last)Обработка ошибок
python
from runnev import RunnevError, RateLimitError, AuthenticationError
try:
runnev.publish(stream_id, seq, events)
except RateLimitError as e:
time.sleep(e.retry_after or 1)
except AuthenticationError:
raise # не повторяемо
except RunnevError as e:
print(e.code, e.status, e.request_id, e.doc_url)Исключения: RunnevError (базовое), AuthenticationError,
InvalidRequestError, RateLimitError, ApiError. Каждое
отдаёт code, status, request_id и doc_url.
Поверхность API
| Метод | Возвращает |
|---|---|
create_stream(name, retention_seconds=None, max_bytes=None, mode="json", id=None) | Stream |
list_streams(limit=20, cursor=None) | StreamPage |
get_stream(id) | Stream |
delete_stream(id) | None |
publish(id, seq, events) | PublishResult |
publish_raw(id, seq, data) | PublishResult |
publish_auto(id, events) | PublishResult |
get_cursor(id) | Cursor |
get_batch(id, seq) | Batch |
subscribe(id, cursor=None) | Subscription (итерируемо по Batch) |
Запускаемые примеры лежат в examples/: publish.py,
subscribe.py и raw_msgpack.py.