sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB Schema Design - Chat v reálném čase

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ů.

  1. 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.

  2. 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í.

  3. 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.



  1. MongoDB třídí dokumenty podle vnořených dat

  2. MongDB nemůže najít definici typu Promise

  3. Existuje nějaký lepší shell pro mongo.exe

  4. MongoDB $in Query Operator