PHP bir Dağıtılmış Sistemi Anatomisi

7 Cevap php

Ben kimlikeal bir çözüm onu ​​anlamaya ve daha iyi anlatmaya çalışırken bana biraz zor zaman vererek bir sorunu var, ben burada benim senaryoyu ortaya çıkarmak için gkimlikiyorum.

I've a server that will receive orders from several clients. Each client will submit a set of recurring tasks that should be executed at some specified intervals, eg.: client A submits task AA that should be executed every minute between 2009-12-31 ve 2010-12-31; so if my math is right that's about 525 600 operations in a year, given more clients ve tasks it would be infeasible to let the server process all these tasks so I came up with the kimlikea of worker machines. The server will be developed on PHP.

Worker machines vardır just regular cheap Windows-based computers that I'll host on my home or at my workplace, each worker will have a dedicated Internet connection (with dynamic IPs) ve a UPS to avokimlik power outages. Each worker will also query the server every 30 seconds or so via web service calls, fetch the next pending job ve process it. Once the job is completed the worker will submit the output to the server ve request a new job ve so on ad infinitum. If there is a need to scale the system I should just set up a new worker ve the whole thing should run seamlessly. The worker client will be developed in PHP or Python.

At any given time my clients should be able to log on to the server ve check the status of the tasks they ordered.

Şimdi burada nereye zor kısmı başladı şöyledir:

  • I must be able to reconstruct the already processed tasks if for some reason the server goes down.
  • The workers vardır not client-specific, one worker should process jobs for any given number of clients.

Ben general database design ve hangi teknolojilerin kullanılması ile ilgili bazı şüpheler var.

Başlangıçta birkaç SQLite veritabanları ve joining them all on the server but I can't figure out how I would group by clients to generate the job reports kullanarak düşündüm.

Ben aslında aşağıdaki teknolojilerin hiç çalışmamıştım: memcached, CouchDB, Hadoop ve tüm gibi, ama ben bilmek istiyorum herhangi bir if Bu benim sorunum için uygundur, ve evet, bir acemi için tavsiye edersiniz ki eğer "dağıtılmış bilgi işlem" (ya da bu paralel nedir?) benim gibi. Please keep in mind that the workers have dynamic IPs.

Ben de hala herhangi bir R (D) DBMS seçilmedi ama ben var ve bunu ben seçmek DBMS agnostik olduğunu düşünüyorum bir konu ile ilgili kısmen çünkü, genel veritabanı tasarımı ile sorun yaşıyorum önce dediğim gibi queuing system ... Ben precalculate all the absolute timestamps to a specific job ve have a large set of timestamps, yürütmek ve bayrak artan düzende bunları tam veya I when timestamp modulus 60 == 0 -> execute {["gibi daha akıllı sisteme sahip olmalı olmalı Diğerleri aşırı yaparken bazı işçiler hiçbir şey yapmadan bekliyor olabilir çünkü (3)]} onlar olmalıdır. What do you suggest?

PS: I'm not sure if the title ve tags of this question properly reflect my problem ve what I'm trying to do; if not please edit accordingly.

Giriş için teşekkür ederiz!

@timdev:

  1. Giriş çok küçük bir json kodlanmış dize olacak, çıkış da bir json enconded dize olacak ama biraz daha büyük (1-5 KB sırayla).
  2. Çıktı Web'den birkaç mevcut kaynaklar kullanılarak bilgisayarlı olacak şekilde ana darboğaz muhtemelen bant genişliği olacaktır. R (D) DBMS bağlı olarak - Veri tabanı, aynı zamvea biri olabilir yazar.

7 Cevap

Bu yeniden eşiğinde konum gibi görünüyor Gearman. İşte Gearman için giriş bulunuyor:

Gearman provides a generic application framework to farm out work to other machines or processes that are better suited to do the work. It allows you to do work in parallel, to load balance processing, and to call functions between languages. It can be used in a variety of applications, from high-availability web sites to the transport of database replication events. In other words, it is the nervous system for how distributed processing communicates.

Siz PHP müşteri ve arka-uç işçi hem de kod yazabilirsiniz.


Windows için derlenmiş bir Gearman Server hakkında sorunuza Re: Ben Windows için önceden inşa edilmiş bir pakette mevcut olduğunu sanmıyorum. Gearman hala oldukça genç bir proje olduğunu ve Windows için hazır-çalıştırmak dağılımlarının üretme noktasına olgunlaştı olmayabilir.

Sun / MySQL çalışanları Eric Günü ve Brian Aker Temmuz 2009 yılında OSCON de Gearman için tutorial verdi, ama onların slaytlar sadece Linux paketlerini söz.

İşte Gearman-Sunucu, Microsoft C derleyicisi (cl.exe) kullanarak Win32 üzerinde inşa edilebileceğini belirtir, ve bu testleri geçer Perl CPAN Test projesine bir bağlantı var: http://www.nntp.perl.org/group/perl.cpan.testers/2009/10/msg5521569.html Ama ben 'kaynak kodu indirmek ve kendiniz inşa etmek var sanırım d.

Gearman Bu senaryo için mükemmel aday gibi, hatta ne kadar çok ihtiyacım işlem gücü bağlı olarak makine başına birden fazla işçi düğümler size pencere makineleri sanallaştırmanıza isteyebilirsiniz görünüyor.

Ayrıca persistent queue system Gearman işler kaybolmadan önler zaman bir işçi veya Gearman sunucu çöker. Bir servis, kaza / yeniden başlatmadan önce bıraktığı nerede kuyruk sadece devam ediyor yeniden başlattıktan sonra, uygulamada tüm bu dikkat çekmek zorunda değilsiniz ve bu büyük bir avantaj olduğunu ve zaman / kod sürü kaydeder

Özel bir çözüm çalışma bu çok iyi şu anda sizin için en iyi çözüm olabilir bu işe ama Gearman avantajları özellikle kalıcı sıra bana görünebilir. Ama Gearman için bir windows ikili bilmem ama ben mümkün olması gerektiğini düşünüyorum.

Basit bir çözüm bağlı birden çok php-düğümleri tek bir veritabanına sahip olacaktır. Eğer uygun bir RDBMS (mSQL + InnoDB yapacak) kullanıyorsanız, bir kuyrukta gibi bir tablo hareket olabilir. Her işçi daha sonra üzerinde çalışmak ve işlemleri kullanarak ve senkronize etmek için kilitleme, tamamlandıktan sonra tekrar veritabanına yazmak için bu görevleri çeker. Bu giriş / çıkış veri boyutuna biraz bağlıdır. Eğer büyükse, bu en iyi düzeni olmayabilir.

Küçük uygulamalar için, çok iyi eşzamanlılık işlemek değil çok harika bir veritabanı olmasına rağmen ben tüm veritabanını kilitlemek ve bir sinlge işlem dek kilitli tutmak için sadece bir kilitleme strategey vardır, görevin bu tür için sqlite önleyeceğini tamamlandı.

Sanayi gücü eşzamanlılık ve kilit yönetimi var ve çok güzel birden simultanious işlemlerinizi işleyebilir Postgres düşünün.

Ayrıca bu kuyruk için bir iş gibi geliyor! Hte Java dünyasında olsaydı ben çözüm için bir JMS bazlı archictecture öneriyoruz. Orada php benzer ama onun tüm oldukça yeni bir şeyler yapmak için bir 'dropr' projesi yani bu proje için uygun olmayabilir.

Eğer yerine bir merkezi işlem işçi seçilmiş görevleri ayırır bir "komuta ekonomisi" daha işçi iş parçacığı olabildiğince hızlı olarak kullanılabilir "işler" tüketmek "serbest piyasa" çözümü için gitmeli kullanmak Technoligy hangisi.

Bir ana sunucu ve birkaç işçi kurulum senin durumunda doğru görünüyor.

On the master server I would install MySQL (Percona InnoDB version is stable and fast) in master-master replication so you won't have a single point of failure. The master server will host an API which the workers will pull at every N seconds. The master will check if there is a job available, if so it has to flag that the job has been assigned to the worker X and return the appropriate input to the worker (all of this via HTTP). Also, here you can store all the script files of the workers.

On the workers, I would strongly suggest you to install a Linux distro. On Linux it's easier to set up scheduled tasks and in general I think it's more appropriate for the job. With Linux you can even create a live cd or iso image with a perfectly configured worker and install it fast and easy on all the machines you want. Then set up a cron job that will RSync with the master server to update/modify the scripts. In this way you will change the files in just one place (the master server) and all the workers will get the updates.

Işçiler usta değil, tam tersi bağlanıyorsanız, çünkü bu yapılandırmada size IP'ler veya işçi sayısı umurumda değil.

Işçi iş oldukça kolaydır: API aracılığıyla sonucu geri göndermek, bunu, bir iş için API isteyin. Durulayın ve tekrar :-)

Ben bir ana iş distribütör ve işçiler ile doğru yönde gidiyoruz düşünüyorum. Onları HTTP üzerinden iletişim olurdu.

Onlar (Java System.Desktop.something, C execvp) komut dosyalarını çalıştırmak için yetenekleri var gibi, müşteriler olmak C, C + +, Java veya seçsin. Jobs sadece bu komut için bir komut dosyası ve argümanları adı olabilir. Siz müşterilerine işlerde bir statüye dönmek olabilir. Işler başarısız olursa, bunları yeniden olabilir. Siz müşterilerine işleri için her dakika yoklamak (veya her x saniyede ve sunucu sıralamak işleri yapmak) olabilir

PHP sunucu için çalışacak.

MySQL veritabanı için para cezası çalışacak. Başlangıç ​​ve bitiş: ben sadece iki damgalarını yapacak. Sunucuda, ben ZAMAN SANİYE == 0 bakmak istiyorsunuz

Yerine SQL üzerinden kuyruk tekerleği yeniden icat, sisteminizin çekirdek olarak RabbitMQ veya ActiveMQ gibi bir mesajlaşma sistemi kullanabilirsiniz. Bu sistemlerin her biri AMQP protokol sağlar ve sabit disk destekli kuyrukları vardır. Sunucu üzerinde veritabanına bir "sonuç" kuyruğundan sonuçları yazıyor (ya da bazı başka bir şekilde davranır) programınıza ve başka uygun bir "işçi" kuyruğuna yeni iş iter bir uygulama var.

Tüm işçiler RabbitMQ veya ActiveMQ bağlanın. Onlar işi yapmak ve başka bir sıraya koymak yanıtı, çalışma sırasında kapalı çalışma pop. Onlar yaptıktan sonra, onlar "kendi bitti" demek için özgün iş isteği ACK. Bir işçi olan bağlantısını düşerse, iş yüzden başka işçi yapabilirsiniz kuyruğuna restore edilecek.

Kuyruklar (iş tanımları, müşteri detayları, tamamlanan çalışma) dışındaki her şey veritabanında saklanabilir. Ama bir şey gerçek zamanlı başka bir yere koymak gerekir. Kendi iş olarak ben canlı güç kullanımı veri akışı ve yoklamak için veritabanı isabet birçok kişi yaşıyorum kötü bir fikirdir. Ben ettik written about live data in my system.