Там, кажется, проблема связана с синхронностью публикации на сервере Redis.
Испытание на моей машине, показал, что с помощью браузера и основного сервера WebSocket, сообщения будут оба получили и рассматриваются в последовательном порядке.
Развертывание этого демонстрационного приложения на viaduct.io (одно удаленное приложение) показало, что порядок сообщений сохранен.
Подключение сервера websocket к Redis и использование двух удаленных реализаций (один на Heroku и один на viaduct.io), нарушил порядок сообщений.
Это заставляет меня верить, что это вопрос синхронности (условия гонки, связанные с сервером Redis публикации доступа) на каркасе Plezi или - более вероятно (поскольку у вас есть такой же вопрос) - вопросы синхронности, связанные с библиотекой Redis реализация (мьютекс Redis's Redis активен только при установлении соединения. Впоследствии Plezi полагается на реализацию Redis для обеспечения безопасности потоков).
Тест приложение:
Я проверил порядок сообщения с помощью Plezi (основы WebSocket сервер на Ruby) и браузер.
В Plezi, я использовал простой Chatroom приложение, которое автоматически создается при использовании:
plezi mini appname
приложение транслируются все входящие сообщения для всех подключенных клиентов WebSocket (включая отправителя).
На Redis, реализация, трансляция использовала Redis для подключения двух удаленных приложений. Я использовал функцию Auto-redis от Plezi:
ENV['PL_REDIS_URL'] = my_redis_url # it has my password, I don't share ;-)
Я всегда тестировал, используя два окна браузера.
В одном окне браузера, после установления и проверки соединения WebSocket (поэтому сообщение testing
показал на обоих окнах браузера), я выполнил:
for(i=0; i<100; i++) {websocket.send("message number: " + i)}
В другом окне браузера я рассмотрел полученные сообщения вручную.
Как локальная, так и не-redis удаленная реализация сохранили порядок сообщений.
В удаленной реализации с использованием Redis оба окна браузера (также отправка данных) показали, что порядок сообщений искажен. Это означает, что условия гонки, связанные с сервером Redis, заставляют вещание ждать и прерывать порядок передачи .
Порядок приема соответствует порядку передачи (подписанная нить не соответствует условиям гонки, поэтому порядок сообщений сохранен).
Следует отметить, что Plezi многопоточен, это означает, что обработка сообщений является параллельной. Я предполагаю, что если бы контролировал только один поток, условия гонки не будут применяться, и порядок сообщений будет сохранен, но я не тестировал это.
Это может быть проблема параллелизма - в то время как сообщения могут поступать в правильном порядке (уровень TCP), события в очереди websocket могут выполняться в другом порядке, чем ожидалось либо клиентом, либо сервером. Например, хотя в вашем приложении была запланирована «отправка», она может выполняться асинхронно после более поздней «отправки». Также сервер может поставить в очередь несколько событий 'on_message', и они могут выполняться асинхронно в другом порядке, чем полученные/ожидаемые. Нам нужно больше кода, чтобы знать ... – Myst
Это хорошее мышление. Я использую flek веб-сокеты. Я отправлю этот код, когда вернусь. Спасибо –