Soru PHP'de Dağıtılmış Bir Sistemin Anatomisi
İdeal bir çözüm bulmak için bana biraz zaman ayırmakta zorlandığım bir problemim var ve daha iyi açıklamak gerekirse, senaryonumu burada ifşa edeceğim.
Emir alacak bir sunucum var
birkaç müşteriden. Her müşteri olacak
bir dizi yinelenen görev göndermek
bazı belirtilmelidir
aralıklar, ör .: müşteri A görev teslim eder
Her biri idam edilmeli AA
2009-12-31 arası ve
2010-12-31; öyleyse matematiğim doğruysa
Bu yaklaşık 525 600 işlem bir
yıl, daha fazla müşteri ve görev verildi
sunucunun tüm bu görevleri işlemesine izin vermek mümkün olmaz yani ben
işçi fikri ile geldi
makineleri. Sunucu geliştirilecek
PHP'de.
İşçi makineleri sadece normal ucuz
Windows tabanlı ben yapacağım bilgisayarlar
evimde veya işyerlerimde ev sahibi,
her işçi adanmış olacak
İnternet bağlantısı (dinamik IP'lerle)
ve elektrik kesintilerinden kaçınmak için bir UPS. Her
işçi ayrıca sunucuyu her sorgulayacak
Web servis çağrıları ile 30 saniye
Bir sonraki bekleyen işi getir ve işle.
İş bittikten sonra işçi
çıktıyı sunucuya gönderin ve isteyin
yeni bir iş ve böylece sonsuza dek. Eğer
sistemi ölçeklendirmeye ihtiyaç var
sadece yeni bir işçi kurmalı ve
her şey sorunsuz bir şekilde çalışmalı.
Çalışan müşteri geliştirilecek
PHP veya Python'da.
Herhangi bir zamanda müşterilerim olmalıdır
sunucuya giriş yapabilir ve kontrol edebilir
sipariş ettikleri görevlerin durumu.
İşte buradaki zor kısım şu şekilde başladı:
- Yeniden inşa edebilmeliyim
Bazıları için zaten işlenmiş görevler
Sunucunun çökmesine sebep olur.
- İşçiler müşteriye özgü değiller.
bir işçi
belirli sayıda müşteri.
İle ilgili bazı şüphelerim var genel veritabanı tasarımı ve hangi teknolojileri kullanacaksınız.
Aslında birkaç tane kullanmayı düşündüm SQLite veritabanları ve hepsini sunucuya katmakla kalıyorum, ancak iş raporlarını oluşturmak için istemciler tarafından nasıl gruplandırılacağımı anlayamıyorum.
Asla aşağıdaki teknolojilerden hiçbiriyle çalışmadım: memcached, CouchDB, Hadoop ve tüm bunlar gibi, ama bunlardan herhangi birinin benim sorunum için uygun olup olmadığını bilmek istiyorum ve eğer yeni bir kullanıcı için tavsiye ederseniz, benim gibi “dağıtılmış bilgi” (veya bu paralel mi?). Çalışanların dinamik IP'leri olduğunu unutmayın.
Daha önce de söylediğim gibi, genel veritabanı tasarımı konusunda da sorun yaşıyorum, çünkü hala belirli bir R (D) DBMS'yi seçmedim, fakat benim ve benim seçtiğim DBMS için agnostik olduğunu düşündüğüm bir sorun göre kuyruk sistemi... Yapmalımıyım Tüm mutlak zaman damgalarını belirli bir işe önceden hesaplar ve büyük bir zaman damgası kümesi vardır., onları aşağı yukarı sırayla tamamlayın ve işaretleyin ya da daha akıllı bir sisteme sahip olmalıyım.zaman damgası modülü 60 == 0 -> yürütüldüğünde"Bu" akıllı "sistemle ilgili sorun şu ki bazı işler sırayla idam edilmeyecek Çünkü bazı işçiler, başkaları aşırı yüklenirken hiçbir şey yapmadan bekleyebilirlerdi. Sen ne önerirsin?
Not: Bu sorunun başlığı ve etiketleri sorunumu ve ne yapmaya çalıştığımı doğru şekilde yansıtıp yansıtmadığından emin değilim; değilse, lütfen buna göre düzenleyin.
Girdiniz için teşekkürler!
@timdev:
- Giriş çok küçük bir JSON kodlanmış dizgedir, çıktı ayrıca bir JSON sınanmış dize, ancak biraz daha büyük (1-5 KB sırasına göre) olacaktır.
- Çıktı, Web'deki mevcut çeşitli kaynaklar kullanılarak hesaplanacak, böylece ana darboğaz muhtemelen bant genişliği olacaktır. Veritabanı yazarları da bir olabilir - R (D) DBMS'ye bağlı olarak.
26
2017-10-04 17:44
Menşei
Cevaplar:
Yeniden yaratmanın eşiğinde gibisin Gearman. İşte Gearman için giriş:
Gearman genel bir uygulama sağlar
çalışma dışarı diğer çiftlik
daha iyi makineler veya süreçler
işi yapmak için uygun. Size izin veriyor
paralel çalışmak, yüklemek
dengesini işleme ve aramak
diller arasında işlevler. Olabilir
çeşitli uygulamalarda kullanılır,
yüksek kullanılabilirlikli web sitelerinden
veritabanı çoğaltmanın taşınması
olaylar. Başka bir deyişle,
dağıtılan için sinir sistemi
işleme iletişim kurar.
Hem istemci hem de arka uç işçi kodunu PHP'de yazabilirsiniz.
Windows için derlenmiş bir Gearman Server ile ilgili sorunuzu yanıtlayın: Windows için önceden oluşturulmuş temiz bir paket içinde mevcut olduğunu sanmıyorum. Gearman hala oldukça genç bir projedir ve Windows için hazır dağıtım üretme noktasında olgunlaşmamış olabilir.
Sun / MySQL çalışanları Eric Day ve Brian Aker bir öğretici Temmuz 2009'da OSCON'da Gearman için, ancak onların slaytları sadece Linux paketlerinden bahsediyor.
İşte Perl CPAN Testleri projesinin bir bağlantısıdır, bu da Gearman-Server'ın Microsoft C derleyicisini kullanarak Win32 üzerinde oluşturulabileceğini gösterir.
cl.exe) ve testleri geçiyor: http://www.nntp.perl.org/group/perl.cpan.testers/2009/10/msg5521569.html Ama sanırım kaynak kodunu indirip kendin yapmalısın.
15
2017-10-05 00:20
Gearman Bu senaryo için mükemmel bir aday gibi görünüyor, hatta ne kadar bilgi işlem gücüne gereksinim duyduğunuza bağlı olarak, windows makinelerini makine başına birden çok çalışan düğümüne sanallaştırmak isteyebilirsiniz.
Ayrıca kalıcı kuyruk sistemi Gearman'da, bir çalışan veya dişli kutusu sunucusu çöktüğünde işlerin kaybolması önlenir. Bir hizmetin yeniden başlatılmasından sonra kuyruk sadece çökme / yeniden başlatmadan önce kaldığı yerden devam eder, uygulamanızda tüm bunlara dikkat etmeniz gerekmez ve bu büyük bir avantajdır ve zaman / koddan tasarruf sağlar.
Özel bir çözüm üretmek işe yarayabilir, ancak özellikle sürekli sıradaki vitesin avantajları bana şu an için en iyi çözüm olabilir. Gearman için bir windows ikili hakkında bilmiyorum ama mümkün olabileceğini düşünüyorum.
4
2017-10-13 23:58
Daha basit bir çözüm, birden çok php-düğümüne bağlı tek bir veritabanına sahip olmaktır. Uygun bir RDBMS kullanırsanız (MSql + InnoDB yapar), bir tablonun sıra olarak davranmasını sağlayabilirsiniz. Her bir işçi, daha sonra üzerinde çalışacak ve işlemleri tamamlayarak, senkronize etmek için kilitleme yaparak kilitleme yaparak veritabanına geri yazacaktır. Bu giriş / çıkış verilerinin büyüklüğüne bağlıdır. Büyükse, bu en iyi program olmayabilir.
3
2017-10-05 07:00
Küçük uygulamalar için çok harika bir veritabanı olmasına rağmen, bu tür bir görev için sqlite'i engellerdim, eşzamanlılığı çok iyi idare etmez, tüm veritabanını kilitlemek ve bir sinlge işlemine kadar kilitli tutmak için tek bir kilitleme stratejisine sahiptir. tamamlandı.
Endüstriyel mukavemet eşzamanlılığı ve kilit yönetimine sahip Postgres'i düşünün ve birden fazla simultane işlemi çok güzel bir şekilde ele alabilir.
Ayrıca bu, kuyruk için bir iş gibi geliyor! Java dünyasında olsaydınız, çözümünüz için JMS tabanlı bir mimari önerisi öneririm. PHP'de benzer bir şey yapmak için bir 'dropr' projesi var ama hepsi oldukça yeni, bu yüzden projeniz için uygun olmayabilir.
Kullandığınız teknoloji ne olursa olsun, çalışan işçilerin, merkezi bir sürecin işçileri seçmek için görevler tahsis ettiği bir “komuta ekonomisi” değil, mümkün olduğu kadar hızlı bir şekilde “işlerini” mümkün olduğu kadar “serbest piyasa” çözümüne yönlendirmelisiniz.
3
2017-10-15 01:56
Bir ana sunucu ve birkaç çalışanın kurulumu sizin durumunuza doğru görünüyor.
Ana sunucuda MySQL'i kurarım (Percona InnoDB sürümü) istikrarlı ve hızlı) master-master çoğaltmada, tek bir hata noktanız olmayacak.
Ana sunucu, işçilerin her N saniyede çekeceği bir API'ye ev sahipliği yapacak. Master, bir işin mevcut olup olmadığını kontrol edecektir, eğer varsa, işçinin X işçisine atandığını işaret etmeli ve uygun girdiyi işçiye iade et (tüm bunları HTTP üzerinden).
Ayrıca, işçilerin tüm senaryo dosyalarını burada saklayabilirsiniz.
İşçiler üzerindeLinux dağıtımını yüklemenizi şiddetle öneririm. Linux'ta programlanmış görevleri ayarlamak daha kolaydır ve genel olarak iş için daha uygun olduğunu düşünüyorum.
Linux ile mükemmel yapılandırılmış bir çalışanla canlı bir cd veya iso görüntüsü oluşturabilir ve istediğiniz tüm makinelere hızlı ve kolay bir şekilde yükleyebilirsiniz.
Ardından, komut dosyalarını güncelleştirmek / değiştirmek için ana sunucuyla RSync oluşturacak bir cron işi kurun. Bu sayede dosyaları tek bir yerde (ana sunucu) değiştirecek ve tüm çalışanlar güncellemeleri alacak.
Bu konfigürasyonda, çalışanların ustaya bağlanması nedeniyle IP'leri veya işçi sayısını umursamazsınız, tersi değil.
İşçi işi oldukça kolaydır: bir iş için API isteyin, yapın, sonuçları API yoluyla geri gönderin. Durulayın ve tekrar :-)
3
2017-10-17 04:20
Kuyruk tekerleğini SQL üzerinden yeniden icat etmek yerine, mesajlaşma sistemini kullanabilirsiniz. RabbitMQ veya ActiveMQ Sisteminizin çekirdeği olarak. Bu sistemlerin her biri AMQP protokolünü sağlar ve sabit disk destekli kuyruklara sahiptir. Sunucunuzda, programınıza göre yeni işleri bir "çalışan" kuyruğuna iten ve bir "sonuç" kuyruğundaki sonuçları veritabanına yazan (veya başka bir şekilde hareket eden) bir başka uygulamanız vardır.
Tüm çalışanlar RabbitMQ veya ActiveMQ'ya bağlanır. İşi iş kuyruğundan çıkarırlar, işi yaparlar ve cevabı başka bir kuyruğa sokarlar. Bunu yaptıktan sonra, orijinal iş isteğini "işini bitirdi" demek için ACK'lar. Bir çalışan bağlantıyı bırakırsa, iş başka bir çalışanın bunu yapabilmesi için sıraya geri yüklenir.
Kuyruktan başka her şey (iş tanımları, müşteri detayları, tamamlanmış çalışma) veritabanında saklanabilir. Ama gerçek zamanlı bir şey başka bir yere konulmalıdır. Kendi çalışmamda, canlı güç kullanım verilerini aktarıyorum ve veri tabanına isabet eden pek çok insanın bunu sorgulamak kötü bir fikir. Ya sahibim sistemimde canlı veriler hakkında yazdım.
2
2017-10-19 03:06
Bence bir ana iş dağıtıcısı ve işçileriyle doğru yöne gidiyorsunuz. Onları HTTP üzerinden iletişim kurardım.
Komut dosyalarını çalıştırmak için yetenekleri olduğu için C, C ++ veya Java'yı istemciler olarak seçerim (C'deki execvp, System.Desktop.something Java). İşler sadece bu komut dosyasının bir betiğinin ve argümanlarının adı olabilir. Müşterilerin işlerde bir durum döndürmesini sağlayabilirsiniz. İşler başarısız olursa bunları tekrar deneyebilirsiniz. Müşterilerin her dakika iş için anket yapmasını sağlayabilirsiniz (ya da her x saniyede bir sunucuyu işlerin sıralamasını yap).
PHP sunucu için çalışacaktı.
MySQL veritabanı için iyi çalışırdı. İki zaman damgası yapardım: başla ve bitir. Sunucuda, WHEN SECONDS == 0'ı arardım
1
2017-10-04 18:43