Použil jsem Redis , NGINX &PHP-FPM pro můj projekt chatu. Není to super elegantní, ale funguje to. Skládačka obsahuje několik kousků.
-
Existuje velmi jednoduchý PHP skript, který přijímá klientské příkazy a dává je do jednoho masivního SEZNAMU. Také zkontroluje všechny SEZNAMY místností a soukromý SEZNAM uživatelů, aby zjistil, zda existují zprávy, které musí doručit. Toto je dotazováno klientem napsaným v jQuery a provádí se každých několik sekund.
-
Existuje PHP skript příkazového řádku, který pracuje na straně serveru v nekonečné smyčce, 20krát za sekundu, který kontroluje tento seznam a poté zpracovává tyto příkazy. Skript zpracovává, kdo je v jaké místnosti a oprávnění v paměti skriptů, tyto informace se v Redis neukládají.
-
Redis má SEZNAM pro každou místnost a SEZNAM pro každého uživatele, který funguje jako soukromá fronta. Má také několik počítadel pro každou místnost, ve které se uživatel nachází. Pokud je počítadlo uživatelů menší než celkový počet zpráv v místnosti, získá rozdíl a odešle jej uživateli.
Toto řešení jsem nemohl zátěžově otestovat, ale alespoň z mého základního benchmarkingu by pravděpodobně zvládlo mnoho tisíc zpráv za sekundu. Existuje také možnost přenést to na něco jako Node.js, aby se zvýšil výkon. Redis také dospívá a má některé zajímavé funkce, jako jsou příkazy Pub/Subscribe, které by mohly být zajímavé, které by případně odstranily dotazování na straně serveru.
Podíval jsem se na řešení založená na Comet, ale mnoho z nich bylo komplikovaných, špatně zdokumentovaných nebo by vyžadovalo, abych se naučil úplně nový jazyk (např. Jetty->Java, APE->C), atd... Také doručování a procházení serverů proxy může někdy být problém s Kometou. Proto jsem zůstal u průzkumu.
Představuji si, že byste mohli udělat něco podobného s MongoDB. Sbírka na místnost, sbírka na uživatele a poté sbírka, která udržuje počítadla. Stále budete muset napsat back-endového démona nebo skript, abyste zvládli správu, kam tyto zprávy chodí. Můžete také použít "omezené kolekce" MongoDB, které udržují dokumenty roztříděné a také automaticky vymazávají staré zprávy, ale to může být komplikované při udržování správných počítadel.