написать простой аналог icq

  • Автор темы DedeStoorsRot
  • Обновлено
  • 09, Sep 2010
  • #1
Стоит задача сделать внутрикорпоративный мессенгер, аналог icq. Сразу хочу предупредить - о jabber и др. готовых решения знаю.

По некоторым причинам - нужно написать свой. Будет база под MS SQL 2008 R2, где хранится список пользователей, история сообщений и др. логи. Собственно вопрос вот в чем.

Каким образом клиенту лучше получать сообщения? 1. Самый простой способ.

Прямое подключение к базе (через ADO), клиент периодически опрашивает базу о наличии полученных сообщений.

При отправке сообщения вызывается процедура в базе, сохраняющая сообщение в очереди.

Как мне кажется, минус в том, что будет сильно загружена база (и сервер).

2. Реализовать промежуточный сервер приложений, обрабатывающий запросы от клиентов.

На чем тогда его делать, с помощью Socket?

И будет ли выигрыш по загрузке базы -сомнительно.

3. Хотелось бы, чтобы клиент получал сообщения от сервера (push), а не опрашивал сервер периодически.

Возможно ли такое или это получится доп.

дыра к компу клиента? Какая технология? 4. Как это реализовано в существующих решениях (icq, jabber и т.п.)?

DedeStoorsRot


Рег
29 Apr, 2012

Тем
11412

Постов
15377

Баллов
72447
  • 11, Oct 2010
  • #2
1. Угу, самый простой.

В клиенте поток опроса сервера на предмет наличия новых сообщений.

Простой запрос IF EXISTS.

Тормозить не будет.

2. Выигрыша не будет.

Промежуточному серверу все равно нужно лезть базу. 3. Помнится когда-то давно тоже сидел думал как бы пуш с сервера сделать.

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

Вот примерно так: Как создать трассировку (Transact-SQL)

4. Вот тут есть исходники на дельфе: IMadering Instant Messenger Open Source project ICQ, Jabber, MRA, Twitter
 

Dustypup


Рег
27 Nov, 2008

Тем
74

Постов
205

Баллов
595
  • 11, Oct 2010
  • #3
dustypup, post: 723611:
2. Выигрыша не будет. Промежуточному серверу все равно нужно лезть базу.
При использовании промежуточного сервера все таки реализуется доп. безопасность, т.к. серверу SQL Server можно перекрыть доступ в интернет. Т.е. в интернет обращаться будет промежуточный сервер (со своими возможными дырами, конечно).
 

Demav


Рег
20 Nov, 2008

Тем
74

Постов
227

Баллов
637
  • 11, Oct 2010
  • #4
demav, post: 723610:Стоит задача сделать внутрикорпоративный мессенгер
На то он и внутрикорпоративный чтобы в инет не смотрел. Если надо работать вне локальной сети, то vpn и вперед. "Выигрыша не будет" - это я писал про быстродействие. Насчет безопасности, впрочем, скажу тоже самое.
 

Dustypup


Рег
27 Nov, 2008

Тем
74

Постов
205

Баллов
595
  • 18, Jan 2011
  • #5
Я думаю, с такой нагрузкой справиться и mysql.

Тем более внутрикорпоративный мессенджер.

Сколько предполагаемых юзеров? Главное пользоваться хранимыми процедурами, и не делать жадных запросов типа select * from messages.

Ограничивать дату выборки, например не доставлять клиенту сообщения старше 30 дней.

Ещё сделать случайное время выборки - скажем 20сек+random(20). да, ещё не забываем про кеш.

вот тут пара советов по оптимизации.

http://sorokin.in.ua/?p=309

. по мне первый вариант проще и надёжнее.
 

Timedrops


Рег
06 Feb, 2009

Тем
63

Постов
205

Баллов
530
  • 02, Feb 2011
  • #6
demav, ИМХО, проще всего клиентскому приложению слушать сокет, а из базы, например, из триггера посылать сообщение о том что для него что то есть. По крайней мере, в нашем проекте, мгновенные оповещения об изменении статуса задачи сделаны именно так.
 

VGA1212


Рег
21 Nov, 2008

Тем
77

Постов
176

Баллов
571
  • 02, Feb 2011
  • #7
VGA1212, post: 723618:demav, ИМХО, проще всего клиентскому приложению слушать сокет, а из базы, например, из триггера посылать сообщение о том что для него что то есть. По крайней мере, в нашем проекте, мгновенные оповещения об изменении статуса задачи сделаны именно так.
Не понял куда чего посылает триггер, поясните плз.

Триггер записывает в некую таблицу информацию о том, что для клиента что-то есть? Тогда все равно надо обратиться к базе, сокет не получится использовать.

Или если триггером посылает инфу через сокет (внешняя процедура, DLL), тогда клиентское приложение должно реализовать сокет-сервер, чтобы ему можно было отправить.

Короче, не понял
 

Demav


Рег
20 Nov, 2008

Тем
74

Постов
227

Баллов
637
  • 02, Feb 2011
  • #8
упрощенно выглядит так - на клиенте открыт на прослушивание tcp/ip сокет.

В базе есть таблица в которой хранятся сообщения для клиента.

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

Далее клиент уже лезет в базу и достает тело сообщения. В общем, как то так
 

VGA1212


Рег
21 Nov, 2008

Тем
77

Постов
176

Баллов
571
  • 02, Feb 2011
  • #9
VGA1212, post: 723620:упрощенно выглядит так - на клиенте открыт на прослушивание tcp/ip сокет.

В базе есть таблица в которой хранятся сообщения для клиента.

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

Далее клиент уже лезет в базу и достает тело сообщения.
В общем, как то так



Получается, что каждый клиент должен быть открыт "на вход". ОК, наверное, это можно принять. Но также сервер должен хранить список текущих клиентов, постоянно им пробрасывать проверки на сокеты.

Т.е. должен быть еще некий "сервер приложений" на сервере (вне сервера SQL). Идея вполне реализуема, хотя и необычная.
 

Demav


Рег
20 Nov, 2008

Тем
74

Постов
227

Баллов
637
  • 03, Feb 2011
  • #10
demav, post: 723621:Но также сервер должен хранить список текущих клиентов, постоянно им пробрасывать проверки на сокеты. Т.е. должен быть еще некий "сервер приложений" на сервере (вне сервера SQL).
да, понадобится какая то обвязка, но вполне реализуемая
 

VGA1212


Рег
21 Nov, 2008

Тем
77

Постов
176

Баллов
571
  • 13, Jun 2011
  • #11
Вот вам пример многопоточки на indy использовал данный код для создания некоторого подобия ftp с шифрованием на лету система работает до сих пор на краштесте выдерживала до 50000 подключений ссыль.
http://sourceforge.net/projects/internetdemos/
 

Freeon


Рег
13 Feb, 2009

Тем
71

Постов
195

Баллов
560
  • 16, Nov 2014
  • #12
Сокеты будет назначать сервер при подключении клиента (при прохождении иденфикации)
 

IPS


Рег
19 Sep, 2009

Тем
54

Постов
184

Баллов
474
  • 06, Feb 2015
  • #14
Зачем еще писать icq? стока аналогов... тьма тьмущая...=)) Или это чисто внутрикорпоративная будет аська?
 

Temoxa


Рег
06 Feb, 2015

Тем
72

Постов
226

Баллов
636