Архитектура чата XMPP - PullRequest
       53

Архитектура чата XMPP

0 голосов
/ 22 декабря 2018

Я сейчас подключаюсь к внешнему XMPP-серверу (не моему).Поскольку я не смог найти ни одного XMPP PHP-клиента, который бы соответствовал моим потребностям, я разработал свой собственный простой клиент ( XMPP PHP) .Клиент открывает сокет-соединение с сервером, и именно здесь происходит обмен XML, и эта часть работает хорошо.

Основной причиной разработки этого пакета была его интеграция в корпоративное приложение.Я сделал это и могу успешно отправлять сообщения туда и обратно.

Несмотря на то, что моя конечная цель - иметь открытое соединение через веб-сокет, в настоящее время программа работает, опрашивая сервер с интервалом в 2 с (я использую простое соединение 1on1, нет чатов или подобное):

receiveMessages: function () {
    this.poll = setInterval(function () {
        Ext.Ajax.request({
            url     : 'index.php',
            method  : 'post',
            params  : {
                method: 'receiveMessages',
            },
            scope   : this,
            callback: function (options, success, response) {
                ...
            }
        });
    }, this.pollTimer);
}

И на стороне PHP:

public function receiveMessages()
{
    $messages = $this->client->getMessages();

    if ($messages) {
        foreach ($messages as $message) {
            $message = $this->xml2array($message);

            $conversation = $this->conversationExists($message['@attributes']['from']);
            if ($conversation == null) {

                $preparedConversation = array(
                    ...
                );

                $conversation = $this->_save($preparedConversation ...);
            }

            $message = array(
                ...
            );

            $response = $this->_save($message ...);

            return array(
                'success'  => true,
                'response' => $response,
            );
        }
    }
}

В случае успеха этот метод обновляет интерфейс с полученным сообщением, а также сохраняет сообщение в БД.DB организована таким образом, что у одного User может быть много Conversations, а у одного Conversation может быть много Messages.

Что я не понимаю, так это то, как все должно быть структурировано, чтобы функционировать как некоторые из реальных клиентов чата (Facebook или другие мессенджеры), потому что таким образом я не могу получить желаемый «параллелизм»,Если я войду в свою учетную запись в 2 разных местах, каждое из них будет опрашивать сервер каждые 2 секунды, и это в основном условие гонки, первое, кто получит сообщение, отобразит его.

Если я подумаю об этом, один из способов сделать это правильно - внедрить веб-сокеты на сервер и ожидать внешнего интерфейса для изменений в БД, однако я думаю, что это может привести к значительным накладным расходам чтения в БД.Может кто-нибудь дать мне совет, как это сделать?

...