2015-08-08 1 views
0

Я могу опубликовать свой код здесь, если люди захотят меня, но это может быть простой быстрый ответ, поэтому я еще не сделал этого.Последовательный поток пакетов tcp на сервер с помощью websockets

У меня есть приложение для рабочего стола C#.

Он отправляет информацию на мой сервер с помощью сетевых сокетов.

информация содержит отметку времени, когда эта информация была создана. Он отправляется по заказу на мой сервер.

На моем сервере я сравниваю текущую метку времени с предыдущей меткой времени. Существует довольно много информации, которая поступает в спорадический порядок.

Я думал, что TCP должен был сохранить заказ. Я ошибаюсь? Есть ли способ обеспечить доставку в правильном порядке или мне нужно написать код на моем сервере, чтобы переупорядочить все это?

Я отправляю информацию 20 раз в секунду.

Благодаря

+0

Это может быть проблема параллелизма - в то время как сообщения могут поступать в правильном порядке (уровень TCP), события в очереди websocket могут выполняться в другом порядке, чем ожидалось либо клиентом, либо сервером. Например, хотя в вашем приложении была запланирована «отправка», она может выполняться асинхронно после более поздней «отправки». Также сервер может поставить в очередь несколько событий 'on_message', и они могут выполняться асинхронно в другом порядке, чем полученные/ожидаемые. Нам нужно больше кода, чтобы знать ... – Myst

+0

Это хорошее мышление. Я использую flek веб-сокеты. Я отправлю этот код, когда вернусь. Спасибо –

ответ

1

Там, кажется, проблема связана с синхронностью публикации на сервере 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 многопоточен, это означает, что обработка сообщений является параллельной. Я предполагаю, что если бы контролировал только один поток, условия гонки не будут применяться, и порядок сообщений будет сохранен, но я не тестировал это.

+0

Ничего себе, очень всеобъемлющий! –

+0

Спасибо @AndrewSimpson. – Myst

Смежные вопросы