ASP.net Chat Application с использованием базы данных для очереди сообщений

StackOverflow https://stackoverflow.com/questions/1522935

Вопрос

Я разработал веб -приложение чата, которое использует базу данных SQLServer для обмена сообщениями.

Все клиенты опрашивают каждые X секунды, чтобы проверить новые сообщения.

Очевидно, что этот подход потребляет много ресурсов, и мне было интересно, есть ли «более дешевый» способ сделать это.

Я использую тот же подход для «присутствия»: проверять, кто включен.

Это было полезно?

Решение

Для чего-то вроде приложения чата в реальном времени я бы порекомендовал распределенный кэш с поддержкой SQL. Мне нравится Memcached с поставщиком enyim .net, поэтому я бы сделал что -то вроде следующего:

  1. Пользовательские публикации сообщения
  2. Система записывает сообщение в базу данных
  3. Система записывает сообщение в кеш
  4. Все пользователи периодически опросывают кэш для новых сообщений

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

Другие советы

Без использования плагина/расширения браузера, такого как Flash или Java Applet, браузер, по сути, является инструментом связи с одним способом. Запрос должен быть инициирован браузером для получения данных. Вы не можете «выдвинуть» данные в браузер.

Многие веб -приложения с использованием метода опроса AJAX для моделирования сервера «push». Хитрость заключается в том, чтобы сбалансировать частоту/размер данных с помощью полосы пропускания и ресурсов сервера.

Я только что сделал простое наблюдение за Gmail. Он проводит опрос HTTPPOST каждые 5 секунд. Если нет изменений в состоянии «состояния», размер данных ответа составляет всего несколько байтов (не включая заголовки HTTP). Конечно, у Google есть огромные ресурсы сервера и пропускную способность, поэтому я упоминаю: поиск хорошего баланса.

Это «улучшение пользовательского опыта по сравнению с ресурсом сервера». Возможно, вам придется выпустить творческий способ избирательного участка, а не простые опросы каждые x секунд.

Например, если нет деятельности от партии А, опросить каждые 3 секунды. В то время как партия А печатает, опрос каждые 5 секунд. Это всего лишь иллюстратон, вы можете поиграть с цифрами или выпустить более эффективную.

Наконец, обмен данными. Задача состоит в том, чтобы найти способ передать минимальные размеры данных для передачи той же информации.

мои 2 цента :)

Если вы используете SQL Server 2005, вы можете посмотреть на службы уведомления. Конечно, это заблокирует вас в SQL 2005, поскольку службы уведомлений были удалены в SQL 2008, он был разработан, чтобы позволить SQL Server уведомлять клиентские приложения об изменениях в базе данных.

Если вы хотите что -то более масштабируемое, вы можете поместить пару битовых флагов на запись пользователей. Когда сообщение для пользователя приходит в бит для новых сообщений на True. Когда вы читаете сообщения, измените его на 0. То же самое, когда люди подписываются и выключаются. Таким образом, вы читаете очень маленькое поле, которое имеет чертовски хорошую вероятность того, чтобы уже быть в кеше.

Сделать ли рабочий процесс будет готов. Если это 1, то идите, получите сообщения из таблицы сообщений. Если это 0 ничего не сделает.

В ASP.NET 4.0 вы можете Используйте шаблон наблюдателя с объектами JavaScript и массивами IE: Ajax Json звонит с jQuery и или Pagemethods.

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

Существуют два связанных решения, встроенные в SQL Server 2005 и все еще доступны в SQL Server 2008:

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

2) Уведомления запроса, что позволяет подписчику определить запрос, и уведомления о приеме, когда будет изменен набор данных, который будет вытекать в результате выполнения этого запроса. Построенные на сервисном брокере, уведомления о запросе несколько проще в использовании, но также могут быть несколько менее эффективными. (Не то, чтобы уведомления о запросе и их братья и сестры уведомления о событиях часто ошибаются за уведомления (NS), что вызывает обеспокоенность, поскольку NS отказано в 2008 году, однако уведомления о запросе и событиях все еще полностью доступны и даже улучшаются в SQL Server 2008).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top