Redis Alternatifleri
-
Selamlar
300 kaydi isleyen bir uygulama ve ayni serverda olan ve bu kayitlarin hepsini anlik okuyan baska bir uygulama var. Daha dogrusu suan gelistiriyoruz. Yani bir cache mekanizmasi
Uygulamayi server'da test ederken, console'da kapandigini farkettim. event viewer'dan bakinca söyle bir hata gördüm
Application: MyAssembly.Console.exe CoreCLR Version: 6.0.1322.58009 .NET Version: 6.0.13 Description: The process was terminated due to an unhandled exception. Exception Info: StackExchange.Redis.RedisTimeoutException: Timeout awaiting response (outbound=3KiB, inbound=0KiB, 5891ms elapsed, timeout is 5000ms), command=GET, next: GET ONEETH, inst: 0, qu: 0, qs: 322, aw: False, bw: SpinningDown, rs: ReadAsync, ws: Idle, in: 0, in-pipe: 0, out-pipe: 0, last-in: 21, cur-in: 0, sync-ops: 0, async-ops: 15213131, serverEndpoint: 127.0.0.1:6379, conn-sec: 589.14, mc: 1/1/0, mgr: 10 of 10 available, clientName: WIN-N3L34NRTGMU(SE.Redis-v2.6.90.64945), IOCP: (Busy=0,Free=1000,Min=2,Max=1000), WORKER: (Busy=2,Free=32765,Min=2,Max=32767) , POOL:Threads=5,QueuedItems=122,CompletedItems=24506132), v: 2.6.90.64945 (Please take a look at this article for some common client-side issues that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts)
Arkadas arastirirken söyle bir sey bulmus:
Hata mesajınıza baktığımda, gözüme çarpan iki şey var:
Hatanın in: Hatanın 65536 kısmı, sunucu tarafından gönderilen ve yerel soketinizin arabelleğinde duran ve uygulamanızın bu verileri okumasını bekleyen çok sayıda veriniz olduğu anlamına gelir. Bu genellikle uygulamanızda bir performans sorunu olduğunu gösterir: örneğin yüksek / ani CPU patlamaları veya bellek sayfalamasına neden olan bellek baskısı.
WORKER: (Busy=3,Free=679,Min=1,Max=682) kısmı Threadpool ayarlarınızın ayarlanması gerektiğini gösterir. "Meşgul" değeri "Min" değerinden büyük olduğunda, yanıtları işlerken gecikmeler yaşayacaksınız çünkü threadpool meşgul olduğunda ne kadar hızlı yeni iş parçacığı oluşturacağını kısıtlar.
Redis ile fazla calismadim belki cesitli ayarlarini yapmak lazim. Ama bizim islemlerimizde sikinti cikarmadan memory tabanli bir sey gerekiyor. Verileri memory bellegine bir kere ekledikten sonra artik tüm degerleri güncelliyor. Yani initial durum haric herhangi bir ekleme yok, sadece güncelleme var ve bu degerleri 210-250 ms'de bir tek tek okuyor
Toparlarsam; redis alternatifi memory kayit icin iki uygulamanin da ayni anda kullanabilecegi bir sistem ariyorum. SignalR gibi bir sey kullanip data tasiya bilirim ama 1 milisaniyenin bile önemi oldugundan mümkün mertebe en light way sekilde yapmayi amacliyorum.
Kodlar da söyle pek bir seyi yok zaten.
Bir örnekte Lazy kullanmislar ve lock kullanmislar ama bilemedim
var multiplexer = ConnectionMultiplexer.Connect("127.0.0.1:6379"); services.AddSingleton<IConnectionMultiplexer>(multiplexer); services.AddSingleton<IRedisConnector, RedisConnector>();
public class RedisConnector : IRedisConnector { IDatabase _db; public RedisConnector(IConnectionMultiplexer multiplexer) { _db = multiplexer.GetDatabase(0); } public async Task<string> ReadValue(string key) { RedisKey redisKey = new(key); RedisValue redisValue = await _db.StringGetAsync(redisKey); return redisValue.ToString(); } public async Task WriteValue(string key, string value) { RedisKey redisKey = new(key); RedisValue redisValue = new(value); await _db.StringSetAsync(redisKey, redisValue); } }
-
memcache, hazelcast birde redis'den ayrılan ekibin 2020 yılında redis yapsak nasıl yapardık kafasıyla yaptıkları bir şey vardı adını hatırlayamadım. bunlara bakabilirsin. ama tam olarak neden redis'i değiştirmeyi istediğini anlayamadım. docker'a koysan unuturusun redisi, azıcık confige kafa yoracan senin durumuna göre :)
-
Ehcache i alternatif olarak dusunebilirsin hocam. Kullanimi kolay ve anlaşılır
-
enesshn18 bunu yazdı
Ehcache i alternatif olarak dusunebilirsin hocam. Kullanimi kolay ve anlaşılır
abi jvm tabanlı olunca birde jvm heap sik sok işleri başına dert açabiliyor :/
-
Sabah sakin kafayla uzun uzun yazarım, mevcut sorununu redis ayarlarıyla düzeltebilirsin
cache servisi secerken bir kaç kriter var active/active node lazım mı, bilgileri belli bir düzen(sıra) ile tutacak mısın, hangi dil ve platformu kullanacaksın gibi.
redis'e en iyi alternatif şu anda hazelcast, küçük bir iş yapmıyorsan memcache'e girme.
-
cevaplar icin tesekkürler ancak yazma firsatim oldu.
Bir kac düzenleme yaptim redis'te suana kadar henüz hata olusmadi.
var multiplexer = ConnectionMultiplexer.Connect(new ConfigurationOptions { AbortOnConnectFail = false, ConnectRetry = 5, DefaultDatabase = 0, EndPoints = { { "127.0.0.1", 6379 } } });
su sekilde bir option ekledim, abortonconnectfail propertysi, timeout durumunda exception firlatmayacak ve tekrar baglanma olayini 5 kere deneyecek.
Bir de yazma degil de okumada sikinti oluyor. Yazma alaninda redis %0-0.5 islemci kullanirken, isin icine okuma girince %18-25 civarinda oluyor.
Zaten bizdeki sikinti da okumadan kaynakli. (oradaki metoddan exception geliyor)
Hesaplama ve redisten okuma kisminin cagrilmasini biraz daha iyilestirdim.
Planim su aslinda
yazdigimiz socket app'i baska bir servera tasimak ve oradaki redis'i disari acip cesitli clientlardan o redis'e erisimini saglamak.
Performans acisindan nasil davranis sergiler bilmiyorum ancak olmadi aklimdaki diger düsünce de bir eventbus mimarisi kullanmak geliyor.
redis'e alternatif olarak direk memcache'i aradim zaten, hatirladigim kadariyla bir projede kullanmistim eskiden. Ama Ehcache ya da hazelcast ilk kez duydum, onlari arastirayim.
Sistemi biraz daha büyüttügümüzde toplamda atiyorum en fazla 3000 kayit olur. Burada sorun yeni kayit olusturmadan ziyade, update ve read islemleri. Görünen o ki, redis'te update iyi calisiyor ama read'de sikinti olabiliyor.
Suana kadar bir sikinti olmadi, belki @sandman dedigin gibi ayarlarla ilgili bir sikinti var. Yazini bekliyorum.
Birden fazla node olayini cok ileriki asamalarda düsünebilirim yani cok fazla client olursa o zaman mantikli olur. Kücükten basliyorum bakalim
su link surda kalsin da multiple node'larda bakarim :) https://stackoverflow.com/a/44499302/1022138
unbalanced tarafından 31/Oca/23 00:29 tarihinde düzenlenmiştir -
windows değilde linux makinaya kurup test etsene bi abi
-
TeRRoR bunu yazdı
windows değilde linux makinaya kurup test etsene bi abi
server var ancak henüz linux kurmadim, prod.'u linux + docker ile yapmayi planliyorum.
Son düzenlemelerden sonra suana kadar hala problem cikarmadi. Demek ki bir degistirdigim ayarla ilgiliydi sorun.
-
Unhandled exception. Unhandled exception. StackExchange.Redis.RedisTimeoutException: The timeout was reached before the message could be written to the output buffer,
and it was not sent, command=SET, timeout: 5000, inst: 0, qu: 163, qs: 0, aw: False, bw: CheckingForTimeout, last-in: 0, cur-in: 0, sync-ops: 0, async-ops: 164,
serverEndpoint: 127.0.0.1:6379, conn-sec: n/a, mc: 1/1/0, mgr: 10 of 10 available, clientName: WIN-N3L34NRTGMU(SE.Redis-v2.6.90.64945), IOCP: (Busy=0,Free=1000,Min=2,Max=1000),
WORKER: (Busy=1,Free=32766,Min=2,Max=32767), POOL: (Threads=9,QueuedItems=0,CompletedItems=560), v: 2.6.90.64945 (Please take a look at this article for some common client-side issues
that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts) at MyProject.Redis.RedisConnector.WriteValue(String key, String value, Int32 dbNo) in .....\MyProject\MyProject.Redis\RedisConnector.cs:line 42 at MyProject.Business.Core.CoreFunctions.<>c__DisplayClass10_0.<<_abc_OnSocketValueReceived>b__0>d.MoveNext() in ...\MyProject\MyProject.Business\Core\CoreFunctions.cs:line 77 --- End of stack trace from previous location --- at System.Threading.Tasks.Task.<>c.b__128_1(Object state) at System.Threading.ThreadPoolWorkQueue.Dispatch() at System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart() at System.Threading.Thread.StartCallback()Suan uygulama daha hizli calisiyor ama redis uygulamanin hizina yetisemiyor gibi :)
Kendi bilgisayarimda 16 core var ve burda hic hata vermeden calisiyor. Ancak server'a attigimda bir kac saniye sonra redise yazamiyor. Serverdaki makinede 2 core var.
Ilk mesajda yazdigim WriteValue metodunu core sinifinda await ile cagirdim olmadi, simdi bir threadpool ile denedim yine olmadi.
Event asiri fazla tetikleniyor. Atiyorum her 1 ms'de belki 50 istek gidiyor... redis bunlari isleyemiyor. Henüz alternatiflerine bakmadim, redisle cözebilirsem süper olacak.
Lock koyarsam muhtemelen sikinti cikarmayacaktir ancak, benim isime gelmez, cünkü ben hic bir veriyi kacirmadan anlik yazmak (güncellemek) ve sürekli okumak istiyorum. (iki farkli program var, sikinti yazma kisminda olusuyor)
Fikirlerinizi bekliyorum. @sandman senden ayarlari hala alamadik :))
-
hazelcast'in Hazelcast Jet isminde bir servisi var belki ise yarayabilir
https://hazelcast.com/products/stream-processing/
ya da influxdata ya bakacagim. Benim olay biraz time series'e giriyor. Cünkü zaman bazli veriler aliyorum
Baska servisler de var ama bir cogu cloude bazli calisiyor (aws, azure vs). Ama ben sistemi kendi VPS'ime kurmayi planliyorum ve direk localde calissin. Biraz arastirma yaptim, kullandigim VPS firmasinin da azure gibi bir local network yaratma imkani var.
Yani benim atiyorum 3 tane VPSim olsun, birinde redis server kurulu olsun, diger 2 makineyle, redis server'a local ag üzerinden ulasabiliyorum (henüz test etmedim ama bir protokol ekleyip yapilabiliyormus anladigim kadariyla).
Suan icin tek sorunum, datayi düzgünce kaydedip paralel ya da paralele yakin sekilde datayi okumak.
-
Reis benim sunucuda da sürekli kapanıyor. Cevapları bende merak ediyorum. Socket.io ile dağıtık redis kullanıyorum bende. Sessionlar rediste tutuluyor. Her gün olmasa da arada bir bir anda tüm session düşüyor loglara bakıyorum redis uçmuş. Ram mi şişiyor dedim kendi kendime bir ara rami 128 den 256 çıkardık problem hala devam etti. Bu iş transaction sayısı artınca oldu yanlız. Az session varken bir problem olmuyordu. Her kod get or add ile dolu :D
Bu arada okuma işleminde çok kaynak tüketiyor olması şaşırttı beni. Belki data büyüktür ama bende hiç böyle sorun olmadı. Redis de ortalama 1 GB lık veri var read kısmı çatır çatır çalışıyor. Sunucu da öyle aman aman sunucular değil.