Honker: پابساب و صف کار برای SQLite
خلاصهٔ کاملتر
وقتی پروژهای با SQLite راه میافته، خیلی زود به صف کار و پابساب نیاز پیدا میکنه. جواب معمول اینه که Redis و Celery اضافه کنی. این راهحل کار میکنه، ولی یه دیتاستور دومی وارد میکنه با backup جداگانه، مشکل dual-write بین جدول بیزینس و صف پیامها، و overhead عملیاتی اجرای یه broker. Honker از یه رویکرد متفاوت استفاده میکنه: اگه SQLite دیتاستور اصلیته، صف هم باید توی همون فایل باشه.
Honker یه افزونه SQLite نوشتهشده با Rust هست که semantics مشابه pg_notify پستگرس رو پیادهسازی میکنه. به جای polling مداوم، هر ۱ میلیثانیه یه PRAGMA data_version میخونه (که عملیات چند میکروثانیهای هست) و از این طریق اطلاعرسانی cross-process با تأخیر تکرقمی میلیثانیه رو ممکن میکنه.
مهمترین ویژگی Honker اینه که میشه یه عملیات بیزینسی و enqueue کردن یه تسک رو توی یه تراکنش اتمیک انجام داد. یعنی اگه INSERT سفارش rollback بشه، پیام صف هم باهاش از بین میره:
with db.transaction() as tx:
tx.execute("INSERT INTO orders (user_id) VALUES (?)", [42])
emails.enqueue({"to": "alice@example.com"}, tx=tx)برای مصرف تسکها از یه async iterator استفاده میشه که روی هر commit به دیتابیس بیدار میشه:
async for job in emails.claim("worker-1"):
try:
send(job.payload)
job.ack()
except Exception as e:
job.retry(delay_s=60, error=str(e))Honker علاوه بر صف کار، از decorator-based task هم پشتیبانی میکنه که شبیه Huey و Celery عمل میکنه. میشه تابعی رو با @task تگ کرد تا وقتی صدا زده میشه، به جای اجرای مستقیم، توی صف قرار بگیره:
@emails.task(retries=3, timeout_s=30)
def send_email(to: str, subject: str) -> dict:
return {"sent_at": time.time()}
r = send_email("alice@example.com", "Hi")
print(r.get(timeout=10))برای استریم رویدادهای دائمی هم Honker یه API مجزا داره که هر consumer آفست خودش رو نگه میداره و در صورت crash، رویدادهای از دست رفته رو دوباره دریافت میکنه:
stream = db.stream("user-events")
async for event in stream.subscribe(consumer="dashboard"):
await push_to_browser(event)از طرف Node.js هم میشه به همون دیتابیس وصل شد و از cross-language notify استفاده کرد؛ پایتون notify میده و Node بیدار میشه و بالعکس. البته cross-language روی ویندوز هنوز کامل نیست.
Honker هنوز در مرحله تجربی (experimental) هست و API ممکنه تغییر کنه. اما برای پروژههایی که SQLite انتخابشونه و نمیخوان یه برنامه broker جداگانه راه بندازن، گزینه جذابی به حساب میاد. اگه Postgres داری، pg-boss یا Oban گزینههای بهتری هستن.
نکات کلیدی:
- صف کار و پابساب مستقیم توی فایل SQLite، بدون Redis یا Celery
- اطلاعرسانی cross-process با تأخیر تکرقمی میلیثانیه
- عملیات بیزینسی و enqueue اتمیک در یه تراکنش
- پشتیبانی از Python، Node.js، Go، Ruby، Rust، Bun و Elixir
- امکانات کامل شامل retry، delayed job، rate limiting، cron task و استریم دائمی
- در مرحله تجربی، API ممکنه تغییر کنه




