Bios.Realtime.Valkey 0.2.0
Bios.Realtime.Valkey
Valkey pub/sub üzerinde kullanıcı başına canlı olay kanalı. Bir taraf
PublishAsync ile kullanıcının kanalına olay bırakır; kullanıcının açık
bağlantısını tutan replika hangisiyse SubscribeAsync ile dinler ve iletir.
Replika sayısı arttıkça değişen bir şey yoktur; dağıtım Valkey'in işidir.
Bilerek "elinden geleni yap" biçiminde çalışır: kalıcı gerçek her zaman veritabanındaki kayıttır, bu kanal yalnız "yeni bir şey var" dürtmesini taşır. Valkey düşerse host çalışmaya devam eder, bağlantı arkada kendiliğinden yeniden kurulur, kaçan dürtmeyi kalıcı kayıt telafi eder.
Bağlama
using Bios.Realtime; // paket adi degil -- asagidaki Dikkat bolumune bak
// DIKKAT: bu metot IConfiguration degil, HAM baglanti dizesi alir
services.AddBiosNotificationBus("valkey:6379");
// yayınlayan taraf
await bus.PublishAsync(
userId, new NotificationEvent(NotificationEventTypes.Notification, json), ct);
// dinleyen taraf (örneğin bir SSE ucu)
await foreach (var ev in bus.SubscribeAsync(userId, ct))
{
// ev.Type -> "notification" ya da "progress"
// ev.Json -> govdenin kendisi, bu paket icine bakmaz
}
Olay tipleri NotificationEventTypes içinde sabit olarak durur:
Notification kalıcı bir bildirimin düştüğünü, Progress ise saklanmayan
ilerleme bilgisini anlatır.
Yapılandırma
Ayar bölümü yoktur; bağlantı dizesi metoda doğrudan geçirilir. Dizeyi yapılandırmadan okumak çağıranın işidir:
services.AddBiosNotificationBus(
builder.Configuration.GetConnectionString("Valkey")
?? throw new InvalidOperationException("ConnectionStrings:Valkey eksik."));
{
"ConnectionStrings": {
"Valkey": "valkey:6379"
}
}
Dize StackExchange.Redis biçimindedir: sunucu:port, virgülle ayrılmış ek
seçeneklerle (valkey:6379,password=...). Boş ya da yalnız boşluktan oluşan
bir dize çağrının kendisinde hemen hata verir.
Dikkat
AddBiosNotificationBus ham bağlantı dizesi alır, IConfiguration almaz.
Bu, kardeş paketlerdeki alışkanlığa aykırıdır: AddBiosStorage(configuration)
ve AddBiosMailTransport(configuration) yapılandırmayı kendileri okur, bu
metot okumaz. Yapılandırmayı ona verirsen derlenmez. Sebebi, bağlantı dizesinin
tek bir değer olması ve ürünlerin onu çoğu zaman zaten ConnectionStrings
altında tutuyor olmasıdır; ama tutarsızlık gerçektir, bilerek çağır.
Yayın başarısız olursa çağıran patlamaz. PublishAsync içindeki Valkey
hatasını yakalar, uyarı seviyesinde bir kütük satırı yazar ve normal döner.
Yani await bus.PublishAsync(...) çağrısının hatasız dönmesi, olayın karşı
tarafa ulaştığı anlamına gelmez. Bu kasıtlıdır: kalıcı kayıt
veritabanındadır, kaçan bir dürtmenin bedeli kullanıcının rozeti bir sonraki
sayfa yüklemesinde görmesidir — kaybolmuş bir bildirim değil. Bunun karşılığı
olarak, kalıcı kaydı yazmadan yalnız buraya yayın yapan bir akış kurma:
kaybolan olayı telafi edecek bir şey kalmaz.
Bağlantı kurulamasa bile host açılır. Çoklayıcı AbortOnConnectFail=false
ile kurulur; Valkey ayakta değilken de uygulama başlar ve bağlantı arkada
denenmeye devam eder. Açılışın Valkey'e bakarak "sağlıklı" demesini bekleme.
Paketin adı Bios.Realtime.Valkey, ad alanı ise Bios.Realtime.
using Bios.Realtime.Valkey; yazmak derleme hatası verir. INotificationBus
sözleşmesi Valkey'e ait değildir; Valkey yalnız bugünkü gerçeklemesidir.
Abonelik döngüsünü durduran şey iptal belirtecidir. SubscribeAsync
belirteç iptal edilene kadar (ya da kanal kapanana kadar) akmaya devam eder ve
çıkarken aboneliği kendisi bırakır. SSE ucunda isteğin kendi iptal belirtecini
geçir; geçmezsen döngü, tarayıcı bağlantıyı kapattıktan sonra da ayakta kalır.
No packages depend on Bios.Realtime.Valkey.
.NET 10.0
- StackExchange.Redis (>= 3.1.13)