powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Вопрос по чату
11 сообщений из 11, страница 1 из 1
Вопрос по чату
    #40002430
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте .
Слегка застрял при написании чата.
Есть табличка шапки и табличка списка сообщений . Когда приходит новое пишется в таблицу сообщений и у шапки меняется ссылка на последнее сообщение .
Таким образом пытаюсь обеспечить проверку наличия новых сообщений . У пользователя есть поле последнего прочитанного. Вроде все ок.
Но потенциально при добавлении сообщения можно нарваться на дедлок. Если вдруг придёт одновременно несколько сообщений для одного пользователя в рамках одного чата.
Можно как то победить? Архитектурно .
Можно все написать на редисе. Как оперативное хранилище. Но и тут в этом случае надо делать блокировку.
...
Рейтинг: 0 / 0
Вопрос по чату
    #40002540
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swv
Если вдруг придёт одновременно несколько сообщений для одного пользователя в рамках одного чата.

Значит сделай так, чтобы этого не случилось. Например, однопоточная обработка приходящих сообщений тебя спасёт.
...
Рейтинг: 0 / 0
Вопрос по чату
    #40002618
Никанор Кузьмич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
База реляционная?
Если нет, возьмите реляционную

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

Альтернатива 1.
Последнее прочитанное сообщение (хранится на клиенте):
Код: sql
1.
2.
select max(message_id)
  from message_table


Проверить наличие непрочитанных сообщений:
Код: sql
1.
2.
3.
select count(*)
  from message_table
 where message_id > saved_max_id


Альтернатива 2.
Дополнительное поле "сообщение прочитано". Дефолтное значение - "не прочитано". Выборка всех непрочитанных:
Код: sql
1.
2.
3.
select *
  from message_table
 where already_seen = 0


После выгрузки на клиента - обновить значение поля для всех вычитанных сообщений.
...
Рейтинг: 0 / 0
Вопрос по чату
    #40003126
Swv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никанор Кузьмич
База реляционная?
Если нет, возьмите реляционную

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

Альтернатива 1.
Последнее прочитанное сообщение (хранится на клиенте):
Код: sql
1.
2.
select max(message_id)
  from message_table


Проверить наличие непрочитанных сообщений:
Код: sql
1.
2.
3.
select count(*)
  from message_table
 where message_id > saved_max_id


Альтернатива 2.
Дополнительное поле "сообщение прочитано". Дефолтное значение - "не прочитано". Выборка всех непрочитанных:
Код: sql
1.
2.
3.
select *
  from message_table
 where already_seen = 0


После выгрузки на клиента - обновить значение поля для всех вычитанных сообщений.


Реляционная.


хранить на клиенте последнее прочитанное как то сомнительно. LocalStorage?

Вариант с already_seen это получается надо будет держать отдельную таблицу, где хранить признак already_seen для каждого сообщения каждого пользователя чата? скажется ж на производительности?
...
Рейтинг: 0 / 0
Вопрос по чату
    #40003180
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swv
Здравствуйте .
Слегка застрял при написании чата.
Есть табличка шапки и табличка списка сообщений . Когда приходит новое пишется в таблицу сообщений и у шапки меняется ссылка на последнее сообщение .
Таким образом пытаюсь обеспечить проверку наличия новых сообщений . У пользователя есть поле последнего прочитанного. Вроде все ок.
Но потенциально при добавлении сообщения можно нарваться на дедлок. Если вдруг придёт одновременно несколько сообщений для одного пользователя в рамках одного чата.
Можно как то победить? Архитектурно .
Можно все написать на редисе. Как оперативное хранилище. Но и тут в этом случае надо делать блокировку.


Архитектурно это очередь.
Пока сообщение не взято из очереди, оно не прочитано.
Организовать очередь можно кучей способов.
Есть куча решений. Выбирай не хочу. :-)
...
Рейтинг: 0 / 0
Вопрос по чату
    #40005543
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swv,

Идешь по таблице с сообщениями, блокируешь строку, отправляешь пользователю, если успешно то добавляешь строку в таблицу отправленных и удаляешь из таблицы сообщений на отправку, если не успешно то снимаешь блокировку и в зависимости от причины, либо переходишь к следующей строке либо прекращаешь отправку. Асинхронное подтверждение приема клиентом сообщения будет сложнее и логику нужно реализовывать на обоих сторонах.
...
Рейтинг: 0 / 0
Вопрос по чату
    #40005923
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul
Архитектурно это очередь.


+1


graycode
Идешь по таблице с сообщениями,..


ох уж эти орхетекторы :facepalm:
...
Рейтинг: 0 / 0
Вопрос по чату
    #40005946
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У Oracle есть механизм select... for update skip locked.

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


mad_nazgul
Архитектурно это очередь.
Пока сообщение не взято из очереди, оно не прочитано.
Организовать очередь можно кучей способов.
Есть куча решений. Выбирай не хочу. :-)

Когда сообщение взято из очереди его больше там нет, внезапно кому то захочется перечитать все сообщения за последние сутки (данные на клиенте были потеряны), куда очередь прикладывать?
...
Рейтинг: 0 / 0
Вопрос по чату
    #40005986
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:double facepalm:
...
Рейтинг: 0 / 0
Вопрос по чату
    #40005991
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Swv
Но потенциально при добавлении сообщения можно нарваться на дедлок. Если вдруг придёт одновременно несколько сообщений для одного пользователя в рамках одного чата.

Создайте таблицу пользователь - чат - номер сообщения, строка таблицы является семафором, сообщения добавляются по следующему алгоритму: транзакция открывается, update строки с номером сообщения - инкремент номера, insert в таблицу сообщений нового сообщения с полученным на предыдущем шаге номером, транзакция закрывается. Транзакции через семафор, быстрые и короткие, никаких дедлоков быть не должно. На клиенте хранится номер последнего принятого сообщения, если он отличается от номера сообщения в таблице "пользователь - чат - номер сообщения" (читатели не должны блокировать писателей), значит есть новые сообщения. У пользователя может быть не одно устройство с клиентской частью чата, на разных устройствах может быть разное состояние, т.е. последнее полученное сообщение и соответственно его номер может отличаться.
...
Рейтинг: 0 / 0
Вопрос по чату
    #40005996
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Swv
Но потенциально при добавлении сообщения можно нарваться на дедлок.

Это ещё надо постараться. Мне даже сходу не приходит в голову, как выстроить архитектуру так, чтобы это было возможно. Впрочем, есть универсальный ответ - используй serializable. Тогда дедлока заведомо не будет, максимум некоторые транзакции будут отваливаться по cannot serialize - но в этом случае их будет достаточно просто-напросто повторить. Для чата самое то.

Swv
Если вдруг придёт одновременно несколько сообщений для одного пользователя в рамках одного чата.

Обычно в чате сообщения для всех пользователей, а адресат - в лучшем случае необязательное информационное поле.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Вопрос по чату
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]