Нужна помощь с архитектурой для веб-сайта торгов - PullRequest
2 голосов
/ 21 сентября 2011

Я пытаюсь создать сайт, похожий на BidCactus и LanceLivre .

Особая часть, с которой у меня возникают проблемы, - это секундный аспект таймера.

Когда начинается аукцион, таймер на 15 секунд начинает обратный отсчет, и каждый раз, когда человек делает ставку, таймер сбрасывается, и цена предмета увеличивается на 0,01 $.

Я пытался использовать SignalR для этого бита, и хотя он хорошо работает во время пробных запусков в офисе, он просто недостаточно хорош для использования в реальном мире, где считаются секунды. Я получаю ошибки HTTP 503, когда слишком много пользователей делают ставки и бездействуют на сайте.

Как сделать так, чтобы таймер на клиентской стороне показывал правильное оставшееся время?

Позволит ли HTTP, получающий эту информацию с AJAX каждую секунду, правильно отображать пропущенное время? Это запрос каждую секунду!

И не только это, но когда пользователь запрашивает GET, я вычисляю оставшиеся секунды, но до тех пор, пока пользователь не увидит этот ответ, это время больше не будет полезным, поскольку секунда или больше могут проходить между обработкой и возвратом. Ты видишь мою загадку?

Есть предложения о том, как подойти к этой проблеме?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

Существует несколько проблем с решением, которое вы описали:

  1. Это чрезвычайно расточительно.В каждый компьютер в Интернете уже встроены часы с достаточно высокой точностью.
  2. Интернет всегда имеет задержку.К тому времени, когда пакет достигнет клиента, он будет старым.
  3. Интернет - это сеть с переменной задержкой, поэтому время обновления пакетов, которое вы получаете, может быть таким же высоким или большим, чем задержка на одну секунду для одного пакета,и всего за 20 мс для другого пакета.

Требуются сложные алгоритмы, чтобы иметь дело с № 2 и № 3.

Если вы на самом деле нужна точность второго уровня

Существует существующее стандартное для Интернета программное обеспечение, решающее эту проблему - Сетевой протокол времени .

Использование реального клиента NTP (неодин встроенный в Windows - , он только гарантирует, что с точностью до пары секунд ) будет синхронизировать ваш сервер с национальными стандартными NTP-серверами и встроить настоящий NTP-клиент в ваше приложение.Регулярно синхронизируйте время на вашем сервере и регулярно синхронизируйте время на клиенте (возможно, каждый раз, когда они входят / подключаются? Может быть, каждый час?).Затем просто используйте системные часы для расчета времени.

Не пытайтесь синхронизировать системное время клиента - у него может не быть доступа к нему, и уж точно не из браузера.Вместо этого вы можете получить эталонное время относительно системного времени и просто добавить разницу в качестве смещения при вычислениях на стороне клиента.

Если вам на самом деле не нужна точность второго уровня

Возможно, вам не нужно гарантировать точность с точностью до секунды.

Если вы примете это решение, вы можете немного упростить ситуацию.Просто передайте клиенту относительное время окончания для каждого аукциона, а не абсолютное время.Повторно запрашивайте его на стороне клиента очень часто (например, каждую минуту).Их глобальное системное время может быть не синхронизировано, но секундная стрелка на их часах должна довольно точно сбивать секунды.

Если вы хотите сделать это немного более скользким, вы можете попытаться определить (относительный) задержка для каждого звонка на сервер.Отслеживайте, сколько времени прошло между вызовами на сервер, и оставшееся время от предыдущего вызова.Сравните их.Затем вычислите, какое из этих значений меньше, и основывайте свое новое время на этом расчете.

Хотя я буду осторожен при разработке такого решения.Если вы ошиблись в вычислениях или имеете дело с неточными системными часами, вы можете сломать всю модель синхронизации или непреднамеренно заставить клиента предпочесть вызов с максимально высокой задержкой.Убедитесь, что вы учитываете все случаи, если вы пишете "гладкую" версию этого кода:)

0 голосов
/ 21 сентября 2011

Один из способов получить действительно хорошее общение в реальном времени - это открыть соединение из браузера со специальным сервером сокетов tcp / ip, который вы пишете на сервере.Так работает множество пакетов чата в сети.

Дуплексные сокеты позволяют передавать данные в обоих направлениях.Поскольку соединение уже открыто, вы можете отправлять немало очень быстрых данных.

Раньше вам приходилось использовать Adobe Flash для этого.Я не уверен, достаточно ли продвинуты браузеры, чтобы справиться с этим без плагина (например, веб-сокетов?)

Еще один подход, на который стоит обратить внимание, - это длинный опрос.В принципе, устанавливается соединение с сервером, который просто не умирает, и это дает вам возможность на сервере обмениваться битами данных в реальном времени с клиентами.

Только некоторые указатели.Я написал веб-программное обеспечение, используя JavaScript <-> Flash <-> Python/PHP, и был рад, как оно работает.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...