Ajax Ve Laravel İle Pessimistic Locking
-
Müritler Merhaba,
Bir proje üzerinde düşünmekteyim orada şöyle bir nokta takıldı kafama. Senaryo şu şekilde sinema bilet satışı için bir web sitesi olsun. Kullanıcı gelip buradan online olarak bilet alacak. Kullanıcının biri gelip 5A koltuğuna tıkladığında diğer her kullanıcı için bu koltuğu 5 dk süre için kilitleyecek ve satma işlemini yapmayacak. 5 dakikanın sonunda bu koltuktaki kilidi kaldıracak.
Backend olarak PHP-Laravel kullanmayı düşünüyorum. Frontend'de ise Js-Jquery gibi düşünüyorum. Bu koltuk kilitleme olayında backend kısmında kendim bir tabloya her koltuk seçildiğinde bir satır mı ekletmeliyim(5A koltuk kilitlendi) yoksa Laravel'in bunun için bir çözümü var mı? Diğer ve asıl kafama takılan kısmı ise Frontend tarafı. Burada aklımda olan iki senaryo var;
1. Ajax ile mesela her 30 saniyede bir istek gönderip kontrol ettirmek ve dom manipilasyonu ile koltukları kilitlemek. (İstek sayısı çok fazla mı olur? Performans çok mu kötü olur?)
2. Ajax ile her 3-5 dk'de bir kontrol yaptırıp. Ek olarak bir de kullanıcı koltuk seçimi yaptığında kontrol ettirmek.
Frontend kısmındaki kontrolde Ajax sizce mantıklı olur mu? Kullanabileceğim bşka bir alternatif var mı?
Biraz dağınık yazdım galiba ama soruları anladığınızı düşünüyorum :) Backend ve Frontend kısmında sorularımı cevaplayıp, yorumlayabilir misiniz?
Şimdiden teşekkürler müritler.
-
koltuğu tuttuğun tabloya locked_at, locked_user diye bir field ekle, frontendde adam koltuk seçince o koltuğun locked_at fieldına o anki tarih-saati, diğer fielda da session id yi yaz.
kullanıcı başka bir koltuk seçerse önce gidip o session_id ile kilitlenmiş bir koltuk varmı ona bak, varsa onu sil. (update koltuklar set locked_at = null where session_id = $session_id), koltuğu öyle kitle.
sonra laravelde bir cron job olustur, her dakika çalışsın ve db yi gezip 5 dakikadan daha eski kilitlenmiş koltukları silsin.
frontende bi geri sayım sayacı ekleyebilirsin.
eğer backend koltuğu sildiğinde front ende bildirim atmak istiyosan :
front endde koltuğu kilitlerken session id ile bi pusher channelı oluştur, ve onu dinlemeye başla (başka koltuk seçilirse eskisini dinlemeyi bırakırsın tabi)
backenddeki cron jobun 5 dakikadan eski bir locku silerken aynı zamanda event broadcast etsin, böylece front endi haberdar etmiş olursun.
bkz :
pusher.com
https://laravel.com/docs/8.x/broadcasting
https://laravel.com/docs/8.x/scheduling
eventlerin çalışması için queue workerın arkada çalışması gerekiyor, eğer çalıştıramıyorsan(mesela shared hostingdeysen) laravel echo kullanmadan pusher api ye pushlamayı falan deneyebilirisn
edit: ben olsam böyle yaparım daha kısa çözümlerde olabilir.
yolbulucu tarafından 11/Nis/21 20:12 tarihinde düzenlenmiştir -
trnight bunu yazdı
Müritler Merhaba,
Bir proje üzerinde düşünmekteyim orada şöyle bir nokta takıldı kafama. Senaryo şu şekilde sinema bilet satışı için bir web sitesi olsun. Kullanıcı gelip buradan online olarak bilet alacak. Kullanıcının biri gelip 5A koltuğuna tıkladığında diğer her kullanıcı için bu koltuğu 5 dk süre için kilitleyecek ve satma işlemini yapmayacak. 5 dakikanın sonunda bu koltuktaki kilidi kaldıracak.
Backend olarak PHP-Laravel kullanmayı düşünüyorum. Frontend'de ise Js-Jquery gibi düşünüyorum. Bu koltuk kilitleme olayında backend kısmında kendim bir tabloya her koltuk seçildiğinde bir satır mı ekletmeliyim(5A koltuk kilitlendi) yoksa Laravel'in bunun için bir çözümü var mı? Diğer ve asıl kafama takılan kısmı ise Frontend tarafı. Burada aklımda olan iki senaryo var;
1. Ajax ile mesela her 30 saniyede bir istek gönderip kontrol ettirmek ve dom manipilasyonu ile koltukları kilitlemek. (İstek sayısı çok fazla mı olur? Performans çok mu kötü olur?)
2. Ajax ile her 3-5 dk'de bir kontrol yaptırıp. Ek olarak bir de kullanıcı koltuk seçimi yaptığında kontrol ettirmek.
Frontend kısmındaki kontrolde Ajax sizce mantıklı olur mu? Kullanabileceğim bşka bir alternatif var mı?
Biraz dağınık yazdım galiba ama soruları anladığınızı düşünüyorum :) Backend ve Frontend kısmında sorularımı cevaplayıp, yorumlayabilir misiniz?
Şimdiden teşekkürler müritler.
Laravel ile yazılmış şöyle bir script var. Belki işine yarar
https://github.com/mwlmalimi/bus-reservation
Ayrıca laravel kullanacaksan jquery yerine livewire ve alpin.js kullanmanı tavsiye ederim. İşini ciddi derecede kolaylaştırır.
-
imkanın varmı bilmem fakat
node.js ve socket.io kullanabilirsin
-
yolbulucu nun çözümü gayet mantıklı
-
yolbulucu bunu yazdı
koltuğu tuttuğun tabloya locked_at, locked_user diye bir field ekle, frontendde adam koltuk seçince o koltuğun locked_at fieldına o anki tarih-saati, diğer fielda da session id yi yaz.
kullanıcı başka bir koltuk seçerse önce gidip o session_id ile kilitlenmiş bir koltuk varmı ona bak, varsa onu sil. (update koltuklar set locked_at = null where session_id = $session_id), koltuğu öyle kitle.
sonra laravelde bir cron job olustur, her dakika çalışsın ve db yi gezip 5 dakikadan daha eski kilitlenmiş koltukları silsin.
frontende bi geri sayım sayacı ekleyebilirsin.
eğer backend koltuğu sildiğinde front ende bildirim atmak istiyosan :
front endde koltuğu kilitlerken session id ile bi pusher channelı oluştur, ve onu dinlemeye başla (başka koltuk seçilirse eskisini dinlemeyi bırakırsın tabi)
backenddeki cron jobun 5 dakikadan eski bir locku silerken aynı zamanda event broadcast etsin, böylece front endi haberdar etmiş olursun.
bkz :
pusher.com
https://laravel.com/docs/8.x/broadcasting
https://laravel.com/docs/8.x/scheduling
eventlerin çalışması için queue workerın arkada çalışması gerekiyor, eğer çalıştıramıyorsan(mesela shared hostingdeysen) laravel echo kullanmadan pusher api ye pushlamayı falan deneyebilirisn
edit: ben olsam böyle yaparım daha kısa çözümlerde olabilir.
Hocam teşekkürler öncelikle. Pusher'ı araştırdım mantıklı geldi. Fakat şöyle bir şey geliyor aklıma. Örnek senaryo: kullanıcı koltuk adımına geldi, 10 koltuk var 3'ü kilitli. Kullanıcı bir koltuğu seçtiğinde broadcast geçip diğer kullanıcıları haberdar eder diğer kullanıcılardaki o koltuğu da kilitlerim. Bu sayede her kullanıcı için 10 saniyede bir kontrol yapmama gerek kalmaz. Garantiye almak için de 5 dakika da bir cron job çalıştırıp yine bir broadcast geçerim bütün kullanıcılardaki koltuk durumunu update ederim. Bu senaryo işler mi sence/sizce. Bir açık noktası var mı?
-
wert bunu yazdı
imkanın varmı bilmem fakat
node.js ve socket.io kullanabilirsin
Evet aklıma geldi fakat, sadece bu işlem için node.js pek kullanmak istemiyorum.
-
shock56 bunu yazdıtrnight bunu yazdı
Müritler Merhaba,
Bir proje üzerinde düşünmekteyim orada şöyle bir nokta takıldı kafama. Senaryo şu şekilde sinema bilet satışı için bir web sitesi olsun. Kullanıcı gelip buradan online olarak bilet alacak. Kullanıcının biri gelip 5A koltuğuna tıkladığında diğer her kullanıcı için bu koltuğu 5 dk süre için kilitleyecek ve satma işlemini yapmayacak. 5 dakikanın sonunda bu koltuktaki kilidi kaldıracak.
Backend olarak PHP-Laravel kullanmayı düşünüyorum. Frontend'de ise Js-Jquery gibi düşünüyorum. Bu koltuk kilitleme olayında backend kısmında kendim bir tabloya her koltuk seçildiğinde bir satır mı ekletmeliyim(5A koltuk kilitlendi) yoksa Laravel'in bunun için bir çözümü var mı? Diğer ve asıl kafama takılan kısmı ise Frontend tarafı. Burada aklımda olan iki senaryo var;
1. Ajax ile mesela her 30 saniyede bir istek gönderip kontrol ettirmek ve dom manipilasyonu ile koltukları kilitlemek. (İstek sayısı çok fazla mı olur? Performans çok mu kötü olur?)
2. Ajax ile her 3-5 dk'de bir kontrol yaptırıp. Ek olarak bir de kullanıcı koltuk seçimi yaptığında kontrol ettirmek.
Frontend kısmındaki kontrolde Ajax sizce mantıklı olur mu? Kullanabileceğim bşka bir alternatif var mı?
Biraz dağınık yazdım galiba ama soruları anladığınızı düşünüyorum :) Backend ve Frontend kısmında sorularımı cevaplayıp, yorumlayabilir misiniz?
Şimdiden teşekkürler müritler.
Laravel ile yazılmış şöyle bir script var. Belki işine yarar
https://github.com/mwlmalimi/bus-reservation
Ayrıca laravel kullanacaksan jquery yerine livewire ve alpin.js kullanmanı tavsiye ederim. İşini ciddi derecede kolaylaştırır.
Teşekkürler hocam. Bu ara "livewire" çok gözüme çarpıyor eğer öneriyorsan inceleyip kullanmayı düşünüyorum. Gerçekten o kadar kullanışlı ve güzel mi? Jquery'e göre artıları nasıl?
-
trnight bunu yazdıwert bunu yazdı
imkanın varmı bilmem fakat
node.js ve socket.io kullanabilirsin
Evet aklıma geldi fakat, sadece bu işlem için node.js pek kullanmak istemiyorum.
Bir zararı yok, kullanabilirsin eğer shared hosting falan kullanmıyorsan.
Php ile bu tür işleri yapmak kulağı terstten tutmak gibi oluyor. Gereksiz emek, efor ve zaman kaybı.
-
trnight bunu yazdıyolbulucu bunu yazdı
koltuğu tuttuğun tabloya locked_at, locked_user diye bir field ekle, frontendde adam koltuk seçince o koltuğun locked_at fieldına o anki tarih-saati, diğer fielda da session id yi yaz.
kullanıcı başka bir koltuk seçerse önce gidip o session_id ile kilitlenmiş bir koltuk varmı ona bak, varsa onu sil. (update koltuklar set locked_at = null where session_id = $session_id), koltuğu öyle kitle.
sonra laravelde bir cron job olustur, her dakika çalışsın ve db yi gezip 5 dakikadan daha eski kilitlenmiş koltukları silsin.
frontende bi geri sayım sayacı ekleyebilirsin.
eğer backend koltuğu sildiğinde front ende bildirim atmak istiyosan :
front endde koltuğu kilitlerken session id ile bi pusher channelı oluştur, ve onu dinlemeye başla (başka koltuk seçilirse eskisini dinlemeyi bırakırsın tabi)
backenddeki cron jobun 5 dakikadan eski bir locku silerken aynı zamanda event broadcast etsin, böylece front endi haberdar etmiş olursun.
bkz :
pusher.com
https://laravel.com/docs/8.x/broadcasting
https://laravel.com/docs/8.x/scheduling
eventlerin çalışması için queue workerın arkada çalışması gerekiyor, eğer çalıştıramıyorsan(mesela shared hostingdeysen) laravel echo kullanmadan pusher api ye pushlamayı falan deneyebilirisn
edit: ben olsam böyle yaparım daha kısa çözümlerde olabilir.
Hocam teşekkürler öncelikle. Pusher'ı araştırdım mantıklı geldi. Fakat şöyle bir şey geliyor aklıma. Örnek senaryo: kullanıcı koltuk adımına geldi, 10 koltuk var 3'ü kilitli. Kullanıcı bir koltuğu seçtiğinde broadcast geçip diğer kullanıcıları haberdar eder diğer kullanıcılardaki o koltuğu da kilitlerim. Bu sayede her kullanıcı için 10 saniyede bir kontrol yapmama gerek kalmaz. Garantiye almak için de 5 dakika da bir cron job çalıştırıp yine bir broadcast geçerim bütün kullanıcılardaki koltuk durumunu update ederim. Bu senaryo işler mi sence/sizce. Bir açık noktası var mı?
abi hiç gerek yok bunu yapmana, her etkinlik için bir pusher channelı oluştur, kullanıcı koltuk seçince o channela seçilen koltuğu ve etkiliği pushla, etkinlik sayfasında da bu eventi dinle pusherla. zaten koltuk seçilince anında haberin olur.
backendde satın alma tamamlanınca da aynı şekilde event trigger edersin, yine haber edersin frontende
-
neverland bunu yazdıtrnight bunu yazdıwert bunu yazdı
imkanın varmı bilmem fakat
node.js ve socket.io kullanabilirsin
Evet aklıma geldi fakat, sadece bu işlem için node.js pek kullanmak istemiyorum.
Bir zararı yok, kullanabilirsin eğer shared hosting falan kullanmıyorsan.
Php ile bu tür işleri yapmak kulağı terstten tutmak gibi oluyor. Gereksiz emek, efor ve zaman kaybı.
yoo, yok öyle bir şey.