Собираюсь писать Демона, для своего чата.
N (10..200) пользователей держат ПОСТОЯННОЕ соединение с демоном (на каждого пользователя создается отдельный поток).
Каждый пользователь может писать сообщения, которые помещаются в таблицу Messages.
Код: Выделить всё
CREATE TABLE Messages (
MessageID INTEGER NOT NULL, // Generator
DateTime INTEGER NOT NULL,
UserFK INTEGER NOT NULL,
PrivateUID INTEGER,
"Message" VARCHAR(5000) NOT NULL,
ReplyMID INTEGER,
Status SMALLINT NOT NULL CHECK (Status in (0,1,2,3,4)),
ChannelFK INTEGER NOT NULL,
CONSTRAINT PK_Messages PRIMARY KEY (MessageID)
);
У меня есть 2-а варианта:
1. Висит дополнительный поток, который проверяет наличие новых сообщений в таблице. Если есть новые сообщения, то он помещает их в динамическую структуру типа Record (схожа с описанием таблицы Messages). Далее для каждого пользователя в "его" потоке фильтруются "его" сообщения из динамического массива и отсылаются на клиент.
Т.е., в этом случае в каждом из № потоков происходит поиск в массиве.
2. При появлении нового сообщения в каждом из N потоке происходит SELECT из таблицы Messages (100 пользователей - 100 селектов)
Далее сообщения отсылаются клиенту.
Т.е., в этом случае в каждом из № потоков происходит выборка из базе.
P.S. Так как это демон, то с базой работает одно физическое соединение.
В системе есть возможность цитирования, т.е. когда один пользователь цитирует сообщения другого пользователя.
Код: Выделить всё
ALTER TABLE Messages
ADD CONSTRAINT Messages_Messages_FK_ReplyMID FOREIGN KEY (ReplyMID) REFERENCES Messages (MessageID) ON DELETE CASCADE;
Пользователь с ID=1 отправил сообщение, которое получило № в базе MessageID = 123. Все 100 пользователей должны получить это сообщение.
Пользователь с ID=2 процетировал сообщение с MessageID = 123. Все 100 пользователей должны получить это сообщение + получить сообщение, которое процецировано.
В первом случае реализации его можно выбрать пробежав по массиву в каждом из 100 потоков.
Во втором случае реализации его можно получить дополнительным Select, т.е. их уже будет 200 (100 раз одно и тоже сообщение + 100 раз одну и туже цитату)
Как рациональнее организовать работу демона?
С уважением, Иван.