Manual:Job queue/tr

MediaWiki 1.6'da, uzun süre çalışan görevleri eşzamansız olarak gerçekleştirmek için bir iş kuyruğu tanıtıldı. İş kuyruğu, toplu işleme kullanarak birçok kısa görevi tutmak için tasarlanmıştır.



Kurulum
Bunun yerine, komut satırı üzerinden işlerin çalışmasını tamamen arka planda planlamanız önerilir. Varsayılan olarak işler bir web talebinin sonunda çalıştırılır. ile  olarak ayarlayarak bu varsayılan davranışı devre dışı bırakın.

Cron
İşleri her saat çalıştırmak için cron kullanabilirsiniz. Aşağıdakileri crontab dosyanıza ekleyin:

Cron kullanmak, başlamayı kolaylaştırır, ancak e-posta bildirimlerini ve basamaklı şablonu yavaşlatabilir (bir saate kadar beklemek için). Bunun yerine sürekli bir iş yürütme aracı kurmak için aşağıdaki yaklaşımlardan birini kullanmayı düşünün.



Hizmet devamı
Kabuk erişiminiz ve başlangıç ​​betikleri oluşturma olanağınız varsa, işleri kullanılabilir hale geldiklerinde çalıştırmak için basit bir hizmet oluşturabilir ve ayrıca iş çalıştırıcısının sunucunun CPU kaynaklarını tekeline almasını önlemek için bunları azaltabilirsiniz:

Örneğin  altında bir bash betiği oluşturun:

Create script
Sunucunun ne kadar hızlı olduğuna ve işlediği yüke bağlı olarak, her döngüde çalıştırılacak iş sayısını ve her döngüde beklenecek saniye sayısını ayarlayabilirsiniz.

Betiği çalıştırılabilir yapın.

Create service
systemd kullanıyorsa,  dosyasını oluşturarak yeni bir hizmet birimi oluşturun. parametresini, web sunucunuzda PHP çalıştıran kullanıcı olarak değiştirin:

Etkinleştirin ve şu komutlarla başlatın:



Sayfa isteklerinde iş yürütme
Varsayılan olarak, her web isteğinin sonunda, iş kuyruğundan bir iş alınır ve yürütülür. Bu davranış, yapılandırma değişkeni tarafından kontrol edilir. Bu değişkeni  olarak ayarlamak, her istekte bir iş çalıştırır. Bu değişkeni  olarak ayarlamak, web istekleri sırasında işlerin yürütülmesini tamamen devre dışı bırakır, böylece bunun yerine  ile elle veya düzenli olarak komut satırından çalıştırabilirsiniz.

Etkinleştirildiğinde, işler bir soket açılarak ve listelenmemiş bir özel sayfa için dahili bir HTTP isteğinde bulunarak yürütülecektir: Special:RunJobs. Eşzamansız bölüme de bakın.



Performans sorunu
Her web isteğinde iş çalıştırmanın performans yükü çok fazlaysa, ancak işleri komut satırından çalıştıramıyorsanız,,  ile   arasında bir sayıya düşürebilirsiniz. Bu, bir işin her  isteğinde "ortalama olarak" yürütüleceği anlamına gelir.



Manüel kullanımı
İş kuyruğunu manüel olarak boşaltmanın bir yolu da vardır, örneğin birçok sayfada bulunan bir şablonu değiştirdikten sonra. bakım betiğini çalıştırın. Örneğin:

Abandoned jobs
A job can fail for some reasons. To understand why, you have to inspect the related log file.

In any case, if a job fails 3 times (so if the system has done that number of attempts), the job is then considered "abandoned" and it's not executed again.

Relevant source code:

https://doc.wikimedia.org/mediawiki-core/master/php/JobQueue_8php_source.html#l00085

An abandoned job is:


 * not executed anymore from
 * not counted from
 * not automatically removed from the database
 * but are included in the count of Special:Statistics

Eşzamansız
Yapılandırma değişkeni, işin yürütülmesi için dahili bir HTTP isteğinde bulunmanın istenmediği betiklerde, işlerin eşzamanlı olarak yürütülmesini zorlamak için eklenmiştir.

İşleri eşzamansız olarak çalıştırırken, işlerin yürütülmesi için dahili bir HTTP bağlantısı açacak ve işin tamamlanmasını beklemeden sayfanın içeriğini istemciye anında döndürecektir. Aksi takdirde, iş aynı süreçte yürütülecek ve iştemcinin iş tamamlanana kadar beklemesi gerekecektir. İş eşzamansız olarak çalışmadığında, işin yürütülmesi sırasında önemli bir hata oluşursa, istemciye yayılır ve sayfanın yüklenmesini iptal eder.

$wgRunJobsAsync true değerine ayarlansa bile, PHP dahili HTTP isteğini yapmak için bir soket açamazsa, senkronize iş yürütmeye geri döneceğini unutmayın. Ancak, bu dahili isteğin başarısız olabileceği ve eşzamanlı iş yürütmeye geri dönmeden işlerin çalıştırılmayacağı çeşitli durumlar vardır. MediaWiki 1.28.1 ve 1.27.2'den başlayarak, $wgRunJobsAsync artık varsayılan olarak false değerine ayarlanmıştır.



Ertelenen güncellemeler
Ertelenmiş güncellemeler mekanizması, tüm içerik tarayıcıya gönderildikten sonra, kodun yürütülmesinin isteğin sonu için programlanmasına izin verir. This is similar to queuing a job, except that it runs immediately instead of upto several minutes/hours in the future.

DeferredUpdates MediaWiki 1.23'te tanıtıldı ve MediaWiki 1.27 ve 1.28 sırasında büyük değişiklikler aldı. Bu mekanizmanın amacı, daha az iş yaparak web yanıtlarını hızlandırmak ve yanıtın bitiminden sonra mümkün olan en kısa sürede çalıştırılacak bazı işlere öncelik vermektir.

A deferrable update can implement  in order to be queueable as a Job as well. This is used by RefreshSecondaryDataUpdate in core, for example, which means if the update fails for any reason, MediaWiki will fallback to queuing as a job and try again later as to fulfil the contract in question.



MediaWiki 1.22'deki değişiklikler
üzerinde, her bir sayfa isteğindeki iş kuyruğu yürütmesi değiştirildi, bu nedenle, işi sayfayı işleyen aynı PHP işlemi içinde yürütmek yerine, arka planda çalıştırmak için yeni bir PHP cli komutu üretilir. Yalnızca gerçek bir yola ayarlanmışsa veya güvenli mod kapalıysa çalışır, aksi takdirde eski yöntem kullanılır.

Bu yeni yürütme yöntemi bazı sorunlara neden olabilir:


 * , PHP'nin uyumsuz bir sürümüne ayarlanmışsa (örneğin, eski bir sürüm) işler çalışmayabilir (1.23'te düzeltildi).
 * PHP  kısıtlamaları yürürlükte ve  ile izin verilmiyor (, 1.23'te düzeltildi).
 * Performans: iş kuyruğu boş olsa bile, yeni PHP işlemi yine de başlatılır (, 1.23'te düzeltildi).
 * Bazen ortaya çıkan PHP süreci, stdout ve stderr tanımlayıcılarının düzgün bir şekilde yeniden yönlendirilmemesi nedeniyle sunucunun veya yalnızca CLI işleminin askıda kalmasına neden olur (, 1.22'de düzeltildi)
 * Paylaşılan kod (viki çiftlikleri) için çalışmaz, çünkü işi çalıştıran vikiyi tanımlamak için gereken ek parametreleri runJobs.php'ye iletmez (, 1.23'te düzeltildi)
 * , ve  gibi normal kabuk sınırları, arka planda çalıştırılan runJobs.php işleminde uygulanır.

Örneğin ile   olarak belirlemenin yanı sıra, eski istek üzerine iş kuyruğu işlemeye geri dönmenin bir yolu yoktur, bu da başka sorunlara neden olabilir. ayarlayarak tamamen devre dışı bırakılabilir, ancak işler artık sayfa isteklerinde çalışmayacaktır ve beklemedeki işleri düzenli olarak çalıştırmak için runJobs.php'yi açıkça çalıştırmanız gerekir.



MediaWiki 1.23'deki değişiklikler
MediaWiki 1.23'te, 1.22 yürütme yöntemi terk edilir ve işler MediaWiki tarafından kendisine bir HTTP bağlantısı kurarak tetiklenir.

İlk olarak bir API giriş noktası olarak tasarlandı ancak daha sonra listelenmemiş özel sayfa Special:RunJobs  olarak değiştirildi.

1.22'de ortaya çıkan çeşitli hataları çözerken, bir işi yürütmek için yeni bir işlemde belleğe birçok PHP sınıfının yüklenmesini gerektirir ve ayrıca sunucunun işlemesi gereken yeni bir HTTP isteğinde bulunur.



MediaWiki 1.27'deki değişiklikler
MediaWiki 1.25 ve MediaWiki 1.26'da, vikinin özel yapılandırması varsa,  kullanımı bazen işlerin çalıştırılmamasına neden olabilir. Bu, MediaWiki 1.27'de düzeltildi.



MediaWiki 1.28'deki değişiklikler
MediaWiki 1.23 ve MediaWiki 1.27 arasında, kullanımı, MediaWiki istekleri şu anda yapılandırılmış olan sunucu adıyla eşleşmeyen bir sunucu adı veya protokol için ise (örneğin hem HTTP hem de HTTPS'yi desteklerken veya MediaWiki, HTTPS'ye yeniden yönlendiren bir ters proxy'nin arkasındadır). Bu, MediaWiki 1.28'de düzeltildi.



MediaWiki 1.29'daki değişiklikler
MediaWiki 1.27.0 - 1.27.3 ve 1.28.0 - 1.28.2'de, 0'dan büyük bir değere ayarlandığında, aşağıdaki gibi bir hata, hata günlüklerinde veya sayfada görünebilir:

PHP Notice: JobQueueGroup::__destruct: 1 buffered job(s) never inserted

Bu hatanın bir sonucu olarak, iş kuyruğunu temizlemek için olarak elle çalıştırsanız bile, kategori üyelerinin kategori sayfalarında güncellenmemesi veya silinen sayfaların düzenlemelerini görüntüleyen son değişiklikler gibi bazı durumlarda bazı güncellemeler başarısız olabilir. Hata olarak bildirildi ve 1.27.4 ve 1.28.3'te çözüldü.



İş örnekleri


Bir şablon değiştiğinde bağlantı tablolarını güncelleme
Bir şablon değiştiğinde, MediaWiki bu şablonu aşan her madde için iş kuyruğuna bir iş ekler. Her iş, bir maddeyi okumak, herhangi bir şablonu genişletmek ve bağlantı tablosunu buna göre güncellemek için bir komuttur. Önceden, ana bilgisayar maddeleri, ayrıştırıcı önbelleği sona erene veya bir kullanıcı maddeyi düzenleyene kadar güncelliğini yitirdi.



HTML önbelleğinin geçersiz kılınması
Daha geniş bir işlem sınıfı, çok sayıda sayfa için HTML önbelleğinin geçersiz kılınmasına neden olabilir:


 * Bir resmi değiştirme (tüm küçük resimlerin yeniden oluşturulması ve boyutları yeniden hesaplanması gerekir)
 * Bir sayfayı silme (diğer sayfalardan ona giden tüm bağlantıların maviden kırmızıya dönmesi gerekir)
 * Bir sayfa oluşturma veya silme işlemini geri alma (yukarıdaki gibi, ancak kırmızıdan maviye)
 * Bir şablonu değiştirme (şablonu aşan tüm sayfaların güncellenmesi gerekir)

Şablon değişiklikleri dışında, bu işlemler bağlantı tablolarını geçersiz kılmaz, ancak o sayfaya bağlanan veya o resmi kullanan tüm sayfaların HTML önbelleğini geçersiz kılar. Bir sayfanın önbelleğini geçersiz kılmak kısa bir işlemdir; önbellekleri temizlemek için yalnızca tek bir veritabanı alanını güncellemeyi ve çok noktaya yayın paketi göndermeyi gerektirir. Ancak yapılacak yaklaşık 1000'den fazla varsa, uzun zaman alır. Varsayılan olarak, 300 işlem başına bir iş eklenir ( sayfasına bakın)

Bununla birlikte, bir sayfanın önbelleğini temizlemek kısa bir işlem olsa bile, önbellekte olmayan karmaşık bir sayfanın yeniden ayrıştırılması, özellikle çok kullanılan bir şablon düzenlenirse ve bir sayfadaki birçok sayfanın temizlenmesine neden olursa pahalı olabilir. Kısa bir süre ve vikinizde çok sayıda sayfayı yükleyen çok sayıda eşzamanlı ziyaretçi var. Bu, kısa sürede temizlenen sayfa sayısını ile küçük bir sayıya (örneğin 20) düşürerek ve ayrıca   için  düşük bir sayıya (örneğin 5) ayarlayarak hafifletilebilir.



Ses ve video kod dönüştürme
Ses ve video dosyalarının yerel yüklemelerini işlemek için kullanıldığında, iş kuyruğu, çeşitli çözünürlüklerde/biçimlerde potansiyel olarak çok yavaş türev kod dönüştürmelerini çalıştırmak için kullanılır.

Bunlar web isteklerinde çalıştırmak için uygun değil. Bir arka plan çalıştırıcısına ihtiyacınız olacak.

Mümkünse  ve   iş türleri için ayrı koşucular ayarlamanız önerilir. Bu iki kuyruk, farklı dosya alt kümelerini işler. İlki yüksek çözünürlüklü HD videolar için, ikincisi ise daha hızlı işleyen daha düşük çözünürlüklü videolar ve ses dosyaları için.



Tipik değerler
Düşük yük döneminde, iş kuyruğu sıfır olabilir. Wikimedia'da iş kuyruğu pratikte neredeyse hiç sıfır değildir. Yoğun olmayan saatlerde, birkaç yüz ile bin arasında olabilir. Yoğun bir günde birkaç milyon olabilir, ancak hızla %10 veya daha fazla dalgalanabilir.

Special:Statistics
MediaWiki 1.16'ya kadar, iş kuyruğu değeri Special:Statistics sayfasında gösterildi. Ancak, 1,17'den (75272) bu yana kaldırıldı ve şimdi ile görülebilir:

Veritabanındaki işlerin sayısını tahmin eden MySQL kullanılırken API sonucunda döndürülen işlerin sayısı biraz hatalı olabilir. Bu sayı, yakın zamanda eklenen veya silinen işlerin sayısına bağlı olarak dalgalanabilir. Hızlı sonuç boyutu tahminini desteklemeyen diğer veritabanları için gerçek iş sayısı verilir.

<span id="For_developers">

Geliştiriciler için


<span id="Code_stewardship">

Kod yönetimi
<span id="See_also">