powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
23 сообщений из 23, страница 1 из 1
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560113
AndryG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблица с сообщениями чата (id, addtime, caption, ... прочие поля)

Клиенту отдаются сообщения с id больше, чем последнее ним вычитаное, либо не старше 15 секунд (если это перая вычитка).

Вроде всё просто, пока не вспоминаешь, что сообщение с id=7 может быть зафиксировано позже, чем сообщение id=9.
А значит прочитавший сообщения 6, 8, 9 никогда не увидит сообщения #7.

Сообщения в чат пишутся в транзакциях разного типа (согласно основной задаче) и изменить их не получится.

Как научиться вычитывать все сообщения не смотря на очередность комитов?

Единственное, что приходит в голову - это вычитывать все сообщения по времени (последние 15 сек) и отдельно вести учет, какой юзер какие сообщения уже получил.
Но тут добавляется головняк с ведением списка прочитаных сообщений и его очисткой.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560117
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGНо тут добавляется головняк с ведением списка прочитаных сообщений и его очисткой.

Веди его в ОЗУ и проблем не будет. Ну, при рестарте, возможно, покажешь сообщения за
последние 15 секунд дважды, для чата это не смертельно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560131
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryG Как научиться вычитывать все сообщения не смотря на очередность комитов? Order by timestamp
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560135
AndryG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_Pisarevsky, addtime будет содержать время начала транзакции.
Значит история та же самая, что и с ID - сообщение с addtime=7сек комитися в 11 секунд, а последняя вычитка была в 9 секунд. Сообщение утеряно.

Вести учет вычитанных сообщений тоже головняк тот ещё. Для каждого юзера нужно хранить список ID и addtime сообщений.
При вычитывании новой пачки добавлять в эту очередь свежие сообщения и удалять устаревшие. Если хранить всё в memcached, для примера, то однозначно надо будет делать блокировку этой очереди на время вычитывания сообщений.

Блокировки будут для каждого клиента, что уже не так страшно, как сейчас лочится файлик при записи собщений )
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560137
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делать БД центральным элементом системы чата - вообще архитектурная ошибка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560145
AndryG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov, к такому решению пришел из-за транзакций. Чтобы не городить огород с синхронизацией сообщений чата с тем же файлом или каким-либо сервером очередей.
Чат - это часть онлайн игрушки. Много где по коду пишутся системные сообщения (не от игроков) в чат.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560149
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СУБД тут нахер не нужна.
пользуй семафоры, пиши в плоский файл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560151
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGIvan_Pisarevsky, addtime будет содержать время начала транзакции.
Значит история та же самая, что и с ID - сообщение с addtime=7сек комитися в 11 секунд, а последняя вычитка была в 9 секунд. Сообщение утеряно.

Возможно триггер на COMMIT поможет
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560153
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovвообще архитектурная ошибка.Сдается мне на фоне остальных огрехов в постановке использование СУБД не самая большая ошибка. Системные сообщения в чате, система читает из чата... коммит строчки в чате занимает 4 секунды... короче весело.

Сколько там будет юзеров? ну десяток-другой, ну пусть сотня... такую нагрузку ФБ потянет играючи, а там, глядишь, автор научится задачу ставить, да программистов наймет, если народ набежит, в чем (в набегании народа) я лично не уверен.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560154
AndryG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мимопроходящий, опишите подробней, пжлст.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560156
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7mВозможно триггер на COMMIT поможетЭто чтоб уж наверняка? Ага, еще и эвенты применить?
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560193
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGIvan_Pisarevsky, addtime будет содержать время начала транзакции.
У мну глубокий склероз, но он мне шепчет, что now и current_timestamp пишут разное время. Кто из них начало транзакции, а кто время выполнения оператора - ну хоть убей. И чем это тебе поможет - тоже. И так ли это в текущей реализации...
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560198
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Старый плюшевый мишкаnow и current_timestamp пишут разное время
если вызывать не в psql, то пофиг. А если в PSQL (execute block, trigger, procedure), то
http://www.ibase.ru/time_diff/
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560199
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvесли вызывать не в psql, то пофиг
отнюдь. В долгоиграющем селекте очень даже увидишь разницу.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39560200
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGсообщение с id=7 может быть зафиксировано позже, чем сообщение id=9.
чтобы минимизировать это, нужно чтобы транзакция, вставляющая сообщение в чат, действовала максимально короткое время

startTransaction
insert
commit

причем весь этот блок должен срабатывать только когда юзер нажмет кнопку Send.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39563256
AndryG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv, это web приложение, потому транзакции будут максимально короткие. Минимизировать не получится - нужно полностью исключить. Сейчас работает на "минимизированых костылях" и один фиг сообщения теряются.

авторДелать БД центральным элементом системы чата - вообще архитектурная ошибка.
Если не сложно, подробней опишите, пжлст. Вопрос синхронизации транзакций в БД и, допустим, файлов на диске ставит в тупик. Как это вообще делается?
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39563258
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGКак это вообще делается?

Через сервер приложений. Он получает сообщение от одного пользователя, рассылает его
остальным, сохраняет в БД. БД в такой архитектуре может быть и простым текстовым файлом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39564073
AndryG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Модератор вася нажимает кнопку "зарегистрировать клан" на заявке пети.
Стартует обработка запроса регистрации (время т1)
Пока обрабатывается этот запрос, петя в другой транзакции вычитывает чат (т2).
И когда транзакция регистрации клана добавит в чат сообщение для пети "ваш клан зарегистрирован"... его уже никто не будет читать - петя запомнил, что он вычитал все сообщения по т2 включительно.

Почему чат в таблице? Чтобы писать в констекте транзакции и не заморачиваться синхронизацией чата на отдельном движке и движка игры (откатилась на конфликте операция - откатились и все отправленные сообщения в чат).

Dimitry Sibiryakov, я сервер приложений и пишу сейчас - нет на кого решение спихивать )

Смотрю на ветку и думку гадаю: это я такой тупой или это тупо спамеры "умничают". "Всё неправильно", "юзай семафор", "у тебя ничего не получится", "комит четыре секунды". Умники,ёпрст! Если бы я знал как это сделать, то я бы не писал на форум и не просил совета.

Ivan_Pisarevsky, у тебя в голове архитектурная ошибка, раз ты цепляешься к демонстрационным числам. Удивляюсь, как ты ещё не спросил, почему я год не указал в дате, а лишь время. Мне аболютно неитересен твой прогноз успешности проекта - засунь свой смайлик себе куда поглубже. Игра, между тем, работает уже не один год.

Филин Урфину-Джусу одни словом "солнце" подсказал как избавиться от сорняков. Тут, смотрю, весь форум сплошные филины )

Уважаемые филины, постарайтесь выдавить из себя чуть более расширенные ответы - не всегда получается с одного слова понять ваши глубоие мысли :)

Спасибо.
Модератор: Жаворонку рекомендую ознакомиться с сообщением 1991850
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39564079
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGпетя запомнил, что он вычитал все сообщения по т2 включительно.

Вот поэтому не надо извращаться и прилеплять pull-технологии туда, где должны быть
push-технологии.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39564099
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGего уже никто не будет читать - петя запомнил, что он вычитал все сообщения по т2 включительно.
вы уперлись в свою реализацию, поэтому и вот такая фигня получается.
Нельзя на основании последнего считанного идентификатора игнорировать предыдущие.
Как минимум, например, идентификатор нужно присваивать только в момент создания записи в чате, после чего тут же должен следовать коммит. А не заранее дать идентификатор, потом полчаса подождать, и делать коммит.
Ясное дело что идентификатор сильно "устареет". Вам это ведь вроде понятно из самого первого вашего же сообщения.

Надо подумать, как выдаются эти самые идентификаторы? Вы в курсе, что они выдаются в монопольном режиме?
Так что, для имитации этого в чате сообщения тоже должны идти монопольно, или сериализуемо, одно за другим. И никаких параллельных транзакций или вставок (сообщений) быть не должно.
Даже если и не монопольно, все равно нужен алгоритм, который всегда доставит все новые сообщения.
В общем, с базой данных или без, человек должен в чате увидеть все сообщения, которые были написаны. Не может быть сообщения, которое пришло позже того, как сообщения вычитаны, и чтобы человек его не увидел.
AndryGУважаемые филины, постарайтесь выдавить из себя чуть более расширенные ответы
тут не курсы обучения программированию или архитектуре систем.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39564129
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGПочему чат в таблице? Чтобы писать в констекте транзакции и не заморачиваться синхронизацией чата на отдельном движке и движка игры (откатилась на конфликте операция - откатились и все отправленные сообщения в чат).


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

Другими словами
1. В таблице есть колонка groupID, которая изначально содержит NULL

2. Периодически запускаемый "серверный" код будет монопольно назначать groupID. Наверное можно не периодически, а по событию FB.

3. Клиенты вычитывают записи с groupID>номер_последней_загруженной_группы. Опять же - можно периодически, можно по событию от FB.

Как то так.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39564697
AndryG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv, я наверное в ваших глазах реально выгляжу тупым и ленивым студентом.

Я пять раз прочел ваши слова. Вы развернуто описали мою проблему.

Нельзя на основании последнего считанного идентификатора игнорировать предыдущие.
Вы совершенно правы - нельзя.

Как минимум, например, идентификатор нужно присваивать только в момент создания записи в чате, после чего тут же должен следовать коммит. А не заранее дать идентификатор, потом полчаса подождать, и делать коммит.
Ясное дело что идентификатор сильно "устареет". Вам это ведь вроде понятно из самого первого вашего же сообщения.
Да, мне это ясно. Это и есть моя текущая проблема. "после чего тут же должен следовать коммит" не катит. Практика показывает, что даже в зазор 20 мс пусть не часто, но регулярно успевают впихнутся сообщения и нарушить очередь.

Надо подумать, как выдаются эти самые идентификаторы? Вы в курсе, что они выдаются в монопольном режиме?
Так что, для имитации этого в чате сообщения тоже должны идти монопольно, или сериализуемо, одно за другим. И никаких параллельных транзакций или вставок (сообщений) быть не должно.
А как же параллелизм СУБД, транзакции и вот это всё? Ради одного чата высраивать в очередь все запросы? Я не могу на это пойти. Потому и решил запихнуть сообщения чата в таблицу в контекст параллельных транзакций. Чтобы запросы не тормозились на монопольной записи сообщений чата.

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

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

Поповоду "курсов программирования". Может с вашей колокольни ответ "юзай сервер приложений" и должен всё поставить на место. Но я никак не догоняю, как эта фраза отвечает на "алгоритм, который всегда доставит все новые сообщения".

Точно так же как и фраза "СУБД тут нахер не нужна. пользуй семафоры, пиши в плоский файл.". Я слышал про семафоры в многопоточных приложениях. Но я никак не могу придумать, как они мне помогут в web-приложении писать в плоский файл.

Сейчас сообщения пишутся в плоский файл. Давно-давно был жуткий код, где "идентификатором сообщения" был unix_timestamp запроса к серверу. Терялась куча сообщений. Костылем в этот файл добавил ID с генератора БД. Глюки уменьшились, но все равно попадаются "состояние гонки" - сообщения пишутся в файл не по порядку выданых им ID и ломается вычитка данных.
Блокировать подолгу файл для "сериализуемой" записи я не могу - это очень дорогая для производительноти блокировка.

Потому я и решил перенести сообщения в БД - паралеллизм при записи и никаких блокировок. Нет рассинхронизации "закомитили в БД, но не смогли записать в файл". Теперь осталось правильно вычитать записаное.

Есть планка. Не выполнил ее - иди "расти". Согласен - форум этот читать/понимать сложно.
...
Рейтинг: 0 / 0
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
    #39564705
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndryGА как же параллелизм СУБД, транзакции и вот это всё?
оно для другого. Вам же сказали, что есть такая область, как messaging services. Вот это к чатам в первую очередь относится.
К примеру, есть такая штука
https://ru.wikipedia.org/wiki/IBM_WebSphere_MQ
как видите, это совсем не СУБД.

К слову. Чисто через СУБД решить данную проблему можно было бы с использованием InterBase и его фичи ChangeViews. Там всегда видно, какие данные были вставлены, изменены или удалены. И они "исчезают", только если пользователь подтвердил, что их видел.
Но в Firebird я сильно сомневаюсь, что такое будет сделано. Просто потому, что это результат "замораживания версий", а значит, с течением времени производительность системы будет ухудшаться.
Кроме того, вроде как нововведения ФБ 4 по вычистке мусора в середине цепочек версий явно противоречит фиче ChangeViews.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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