Veritabanı ve cache kullanımı
Consumer içinden PostgreSQL, MongoDB ve Redis servislerini aynı DI container ile kullanın.
Bir Consumer handler’ı, HTTP veya WebSocket uygulamasındaki gibi DI üzerinden veri servislerine erişebilir. Bağlantıyı her mesaj için yeniden açmak yerine uygulama container’ında hazırlanan PostgreSQL havuzu, MongoDB servisi veya Redis servisi kullanılır. Handler’ın scope’u ise her delivery için ayrıdır.
İhtiyacınız olan entegrasyonu açın#
| Amaç | Facade feature’ları | Public modül |
|---|---|---|
| PostgreSQL, tek havuz | consumer, postgresql |
lilyrs::postgresql |
| MongoDB, tek bağlantı otoritesi | consumer, mongodb |
lilyrs::mongodb |
| Redis, tek servis | consumer, redis |
lilyrs::redis |
| Named bağlantılar | İlgili *-factory feature’ı |
Aynı entegrasyon modülü |
[dependencies]
lilyrs = { version = "0.1.0", features = ["consumer", "postgresql"] }
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["macros", "rt-multi-thread"] }Bu seçim yalnız normal PostgreSQL erişimini açar. Inbox deduplication ve outbox atomikliği için transactional inbox bölümündeki compound feature ve queue binding gerekir. Aynı backend’in single ve factory feature’larını aynı binary’de birleştirmeyin.
Delivery scope’undan servis çözün#
Handler parametresindeki Service<T>, delivery’nin DI scope’unu kullanır. Kendi repository veya iş servisinizi bu şekilde alın; o servis de #[inject] alanlarıyla veri entegrasyonunu kullanabilir. Scoped bağımlılığı singleton middleware veya guard’ın constructor’ında tutmayın; delivery sırasında exchange.service::<T>() ile çözün.
PostgreSQL repository ve MongoDB collection derive’larının çalışması için uygulamada tanımlanan tipler binary’ye bağlı olmalıdır. Facade, gerekli derive/registry bağlantılarını sağlar; ek linkme veya doğrudan registry dependency’si eklemeyin. Ayrıntılı model tanımları için PostgreSQL ve MongoDB entegrasyon anlatımları da geçerlidir; Consumer tarafında giriş noktası queue handler’dır.
Normal veri erişimi ve atomik işleme#
| İşlem | Gerçek kapsam |
|---|---|
| Handler’dan normal DB yazısı | DB başarılı olsa bile ACK kaybolursa delivery yeniden gelebilir. |
| Transactional context ile DB yazısı | Inbox completion ve aynı transaction içindeki outbox kaydıyla birlikte commit edilir. |
| Redis cache güncellemesi | PostgreSQL veya MongoDB transaction’ının dışında kalır. |
| HTTP çağrısı veya e-posta | DB rollback bu dış etkiyi geri alamaz. |
Cache invalidation veya dış sistem bildirimi gerekiyorsa önce outbox’a niyet kaydedin; bu olayı işleyen tarafta da idempotent davranış kurun. Consumer, Redis için ayrı bir transactional inbox backend’i sağlamaz.
Bağlantı ve kapanış sahipliği#
Consumer’ın kurduğu container ve entegrasyon servisleri, uygulamanın kapanış sırasına dahildir. Caller-owned container verdiğinizde bu container’ı üst uygulama kapatır. Factory modu bağlantı seçimini isimle yapar; queue transaction binding’i ile repository/collection aynı cell’i kullanmalıdır. Named bağlantılar bu ayrımı örneklerle açıklar.
Delivery cancellation tipi ile veri entegrasyonlarının operation context tipleri birbirinin yerine geçmez. Transactional MongoDB kodunda transaction.operation_context() kullanın; normal DB erişiminde entegrasyonun kendi timeout/cancellation sözleşmesine uyun. Detached görevle bir delivery’nin veri işini scope dışına taşımayın.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.