mgsmus
Merhaba,
Farklı kuyrukta çalışmaları lazım. 2 iş sadece 1 noktada kesişiyor o da stok hareketi. Diğer durumları birbirinden bağımsız çalışıyor.
worker 1 -> genel bir stok hareketi kontrol ediyor
worker 2 -> başka bir sistem üzerindeki sipariş hareketi ile 1 veya 1 den fazla ürünün stoğuna etki ediyor
worker 1 çalışması uzun bir süre alabiliyor. Yani bu süre 15-25dk diyebilirim max.
worker 2 ise max 1-2 dakika.
worker 2 bir iş yaparsa ondaki stok aslında gerçek stok olacak. Bu değerleri anlık olarak çekebiliyor olacağım.
worker 1 listesinden bu iş varsa çıkarıp , bunları diğer kuyrukta anlık olarak işletmem lazım.
Dediğiniz gibi tablo ile de yapılabilir.
Tablo da belirleyici bir anahtar , job id , job cache lock key ve joba alınma süreleri olur. joba giriş süresi eğer worker 2 den önce ise bu job id ile job kuyruğundan kaldırma yapmak mantıklı.
Aynı tabloya çok fazla worker bağladığımda burası ne kadar yararlı olabilecek orası biraz tedirgin ediyor. Buraya da bir kuyruklama yapılması gerekecek.
$product->LockKey = $this->clearLockKey($this->options["cacheKey"], $product->ItemCode);
$lock = Cache::lock($product->LockKey, $this->optionsExtra["cacheLockTime"]);
if ($lock->get()) {
if ($this->options["logStatus"]) {
$logOperations->logProcessQueueProduct(
$this->options["logChannel"],
$this->options["onQueueName"],
$key,
$product->ItemCode,
"-");
}
$product->Owner = $lock->owner();
$job = (new ProductJob($product, $this->options, 0))
->onQueue($this->options["onQueueName"]);
$jobID = app(Dispatcher::class)->dispatch($job);
Aslında şurada şöyle bir şey olsaydı süper olurdu. Cache lock dosyasına job id de bağlayabilsek ve ben cache lock gönderdiğimde job varsa onun da release edilme durumu olsaydı. Böylelikle yeni işleri ekleyebilirdim.
Yani cache:lock dosyasında job ıd ile de update geçebilmek.
Cache::lockUpdate($lock->Key,$lock->owner,$jobID)
jobID dolu ise job'un da silinmesi sağlanabilir.
job içerisinde şunlar mevcut $this->job->delete() , $this->job->release()
release ama silip belli dakika sonra işi yeniden ekliyor. ben jobu silsem bile iş o an devam ediyor ve bu işlem sonrasına
if($this->job->isDeleted())
şeklinde bir kontrol koyulması gerekiyor.
Bu veya buna benzer bir durum belki vardır diye foruma yazayım dedim. Benim önerim hakkında ne düşünüyorsunuz ? Issue olarak böyle bir öneride bulunsam kabul edilir mi ?