|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
Таблица с сообщениями чата (id, addtime, caption, ... прочие поля) Клиенту отдаются сообщения с id больше, чем последнее ним вычитаное, либо не старше 15 секунд (если это перая вычитка). Вроде всё просто, пока не вспоминаешь, что сообщение с id=7 может быть зафиксировано позже, чем сообщение id=9. А значит прочитавший сообщения 6, 8, 9 никогда не увидит сообщения #7. Сообщения в чат пишутся в транзакциях разного типа (согласно основной задаче) и изменить их не получится. Как научиться вычитывать все сообщения не смотря на очередность комитов? Единственное, что приходит в голову - это вычитывать все сообщения по времени (последние 15 сек) и отдельно вести учет, какой юзер какие сообщения уже получил. Но тут добавляется головняк с ведением списка прочитаных сообщений и его очисткой. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 17:09 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGНо тут добавляется головняк с ведением списка прочитаных сообщений и его очисткой. Веди его в ОЗУ и проблем не будет. Ну, при рестарте, возможно, покажешь сообщения за последние 15 секунд дважды, для чата это не смертельно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 17:13 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryG Как научиться вычитывать все сообщения не смотря на очередность комитов? Order by timestamp ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 17:50 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
Ivan_Pisarevsky, addtime будет содержать время начала транзакции. Значит история та же самая, что и с ID - сообщение с addtime=7сек комитися в 11 секунд, а последняя вычитка была в 9 секунд. Сообщение утеряно. Вести учет вычитанных сообщений тоже головняк тот ещё. Для каждого юзера нужно хранить список ID и addtime сообщений. При вычитывании новой пачки добавлять в эту очередь свежие сообщения и удалять устаревшие. Если хранить всё в memcached, для примера, то однозначно надо будет делать блокировку этой очереди на время вычитывания сообщений. Блокировки будут для каждого клиента, что уже не так страшно, как сейчас лочится файлик при записи собщений ) ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 18:10 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
Делать БД центральным элементом системы чата - вообще архитектурная ошибка. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 18:12 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, к такому решению пришел из-за транзакций. Чтобы не городить огород с синхронизацией сообщений чата с тем же файлом или каким-либо сервером очередей. Чат - это часть онлайн игрушки. Много где по коду пишутся системные сообщения (не от игроков) в чат. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 18:27 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
СУБД тут нахер не нужна. пользуй семафоры, пиши в плоский файл. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 18:34 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGIvan_Pisarevsky, addtime будет содержать время начала транзакции. Значит история та же самая, что и с ID - сообщение с addtime=7сек комитися в 11 секунд, а последняя вычитка была в 9 секунд. Сообщение утеряно. Возможно триггер на COMMIT поможет ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 18:39 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovвообще архитектурная ошибка.Сдается мне на фоне остальных огрехов в постановке использование СУБД не самая большая ошибка. Системные сообщения в чате, система читает из чата... коммит строчки в чате занимает 4 секунды... короче весело. Сколько там будет юзеров? ну десяток-другой, ну пусть сотня... такую нагрузку ФБ потянет играючи, а там, глядишь, автор научится задачу ставить, да программистов наймет, если народ набежит, в чем (в набегании народа) я лично не уверен. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 18:48 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
Мимопроходящий, опишите подробней, пжлст. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 18:48 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
m7mВозможно триггер на COMMIT поможетЭто чтоб уж наверняка? Ага, еще и эвенты применить? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 18:50 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGIvan_Pisarevsky, addtime будет содержать время начала транзакции. У мну глубокий склероз, но он мне шепчет, что now и current_timestamp пишут разное время. Кто из них начало транзакции, а кто время выполнения оператора - ну хоть убей. И чем это тебе поможет - тоже. И так ли это в текущей реализации... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 21:16 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
Старый плюшевый мишкаnow и current_timestamp пишут разное время если вызывать не в psql, то пофиг. А если в PSQL (execute block, trigger, procedure), то http://www.ibase.ru/time_diff/ ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 21:38 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
kdvесли вызывать не в psql, то пофиг отнюдь. В долгоиграющем селекте очень даже увидишь разницу. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 21:40 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGсообщение с id=7 может быть зафиксировано позже, чем сообщение id=9. чтобы минимизировать это, нужно чтобы транзакция, вставляющая сообщение в чат, действовала максимально короткое время startTransaction insert commit причем весь этот блок должен срабатывать только когда юзер нажмет кнопку Send. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 21:42 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
kdv, это web приложение, потому транзакции будут максимально короткие. Минимизировать не получится - нужно полностью исключить. Сейчас работает на "минимизированых костылях" и один фиг сообщения теряются. авторДелать БД центральным элементом системы чата - вообще архитектурная ошибка. Если не сложно, подробней опишите, пжлст. Вопрос синхронизации транзакций в БД и, допустим, файлов на диске ставит в тупик. Как это вообще делается? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2017, 13:47 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGКак это вообще делается? Через сервер приложений. Он получает сообщение от одного пользователя, рассылает его остальным, сохраняет в БД. БД в такой архитектуре может быть и простым текстовым файлом. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.12.2017, 13:59 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
Модератор вася нажимает кнопку "зарегистрировать клан" на заявке пети. Стартует обработка запроса регистрации (время т1) Пока обрабатывается этот запрос, петя в другой транзакции вычитывает чат (т2). И когда транзакция регистрации клана добавит в чат сообщение для пети "ваш клан зарегистрирован"... его уже никто не будет читать - петя запомнил, что он вычитал все сообщения по т2 включительно. Почему чат в таблице? Чтобы писать в констекте транзакции и не заморачиваться синхронизацией чата на отдельном движке и движка игры (откатилась на конфликте операция - откатились и все отправленные сообщения в чат). Dimitry Sibiryakov, я сервер приложений и пишу сейчас - нет на кого решение спихивать ) Смотрю на ветку и думку гадаю: это я такой тупой или это тупо спамеры "умничают". "Всё неправильно", "юзай семафор", "у тебя ничего не получится", "комит четыре секунды". Умники,ёпрст! Если бы я знал как это сделать, то я бы не писал на форум и не просил совета. Ivan_Pisarevsky, у тебя в голове архитектурная ошибка, раз ты цепляешься к демонстрационным числам. Удивляюсь, как ты ещё не спросил, почему я год не указал в дате, а лишь время. Мне аболютно неитересен твой прогноз успешности проекта - засунь свой смайлик себе куда поглубже. Игра, между тем, работает уже не один год. Филин Урфину-Джусу одни словом "солнце" подсказал как избавиться от сорняков. Тут, смотрю, весь форум сплошные филины ) Уважаемые филины, постарайтесь выдавить из себя чуть более расширенные ответы - не всегда получается с одного слова понять ваши глубоие мысли :) Спасибо. Модератор: Жаворонку рекомендую ознакомиться с сообщением 1991850 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2017, 22:57 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGпетя запомнил, что он вычитал все сообщения по т2 включительно. Вот поэтому не надо извращаться и прилеплять pull-технологии туда, где должны быть push-технологии. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2017, 23:16 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGего уже никто не будет читать - петя запомнил, что он вычитал все сообщения по т2 включительно. вы уперлись в свою реализацию, поэтому и вот такая фигня получается. Нельзя на основании последнего считанного идентификатора игнорировать предыдущие. Как минимум, например, идентификатор нужно присваивать только в момент создания записи в чате, после чего тут же должен следовать коммит. А не заранее дать идентификатор, потом полчаса подождать, и делать коммит. Ясное дело что идентификатор сильно "устареет". Вам это ведь вроде понятно из самого первого вашего же сообщения. Надо подумать, как выдаются эти самые идентификаторы? Вы в курсе, что они выдаются в монопольном режиме? Так что, для имитации этого в чате сообщения тоже должны идти монопольно, или сериализуемо, одно за другим. И никаких параллельных транзакций или вставок (сообщений) быть не должно. Даже если и не монопольно, все равно нужен алгоритм, который всегда доставит все новые сообщения. В общем, с базой данных или без, человек должен в чате увидеть все сообщения, которые были написаны. Не может быть сообщения, которое пришло позже того, как сообщения вычитаны, и чтобы человек его не увидел. AndryGУважаемые филины, постарайтесь выдавить из себя чуть более расширенные ответы тут не курсы обучения программированию или архитектуре систем. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 01:15 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGПочему чат в таблице? Чтобы писать в констекте транзакции и не заморачиваться синхронизацией чата на отдельном движке и движка игры (откатилась на конфликте операция - откатились и все отправленные сообщения в чат). Тебе нужно монопольно, внешними средствами, в отдельной транзакции назначать номера групп новым записям в таблице чата. Другими словами 1. В таблице есть колонка groupID, которая изначально содержит NULL 2. Периодически запускаемый "серверный" код будет монопольно назначать groupID. Наверное можно не периодически, а по событию FB. 3. Клиенты вычитывают записи с groupID>номер_последней_загруженной_группы. Опять же - можно периодически, можно по событию от FB. Как то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 08:43 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
kdv, я наверное в ваших глазах реально выгляжу тупым и ленивым студентом. Я пять раз прочел ваши слова. Вы развернуто описали мою проблему. Нельзя на основании последнего считанного идентификатора игнорировать предыдущие. Вы совершенно правы - нельзя. Как минимум, например, идентификатор нужно присваивать только в момент создания записи в чате, после чего тут же должен следовать коммит. А не заранее дать идентификатор, потом полчаса подождать, и делать коммит. Ясное дело что идентификатор сильно "устареет". Вам это ведь вроде понятно из самого первого вашего же сообщения. Да, мне это ясно. Это и есть моя текущая проблема. "после чего тут же должен следовать коммит" не катит. Практика показывает, что даже в зазор 20 мс пусть не часто, но регулярно успевают впихнутся сообщения и нарушить очередь. Надо подумать, как выдаются эти самые идентификаторы? Вы в курсе, что они выдаются в монопольном режиме? Так что, для имитации этого в чате сообщения тоже должны идти монопольно, или сериализуемо, одно за другим. И никаких параллельных транзакций или вставок (сообщений) быть не должно. А как же параллелизм СУБД, транзакции и вот это всё? Ради одного чата высраивать в очередь все запросы? Я не могу на это пойти. Потому и решил запихнуть сообщения чата в таблицу в контекст параллельных транзакций. Чтобы запросы не тормозились на монопольной записи сообщений чата. Даже если и не монопольно, все равно нужен алгоритм, который всегда доставит все новые сообщения. В общем, с базой данных или без, человек должен в чате увидеть все сообщения, которые были написаны. Не может быть сообщения, которое пришло позже того, как сообщения вычитаны, и чтобы человек его не увидел.Именно за таким решением я и пришел на форум ) И описал в первом топике единственный пример, до чего додумался - хранить для каждого юзера очередь уже вычитаных сообщений. И описал неудобство, что эти очереди придется обслуживать (вычищать старые номера) в монопольном режиме. Но конкретно для каждого юзера - уже легче. Поповоду "курсов программирования". Может с вашей колокольни ответ "юзай сервер приложений" и должен всё поставить на место. Но я никак не догоняю, как эта фраза отвечает на "алгоритм, который всегда доставит все новые сообщения". Точно так же как и фраза "СУБД тут нахер не нужна. пользуй семафоры, пиши в плоский файл.". Я слышал про семафоры в многопоточных приложениях. Но я никак не могу придумать, как они мне помогут в web-приложении писать в плоский файл. Сейчас сообщения пишутся в плоский файл. Давно-давно был жуткий код, где "идентификатором сообщения" был unix_timestamp запроса к серверу. Терялась куча сообщений. Костылем в этот файл добавил ID с генератора БД. Глюки уменьшились, но все равно попадаются "состояние гонки" - сообщения пишутся в файл не по порядку выданых им ID и ломается вычитка данных. Блокировать подолгу файл для "сериализуемой" записи я не могу - это очень дорогая для производительноти блокировка. Потому я и решил перенести сообщения в БД - паралеллизм при записи и никаких блокировок. Нет рассинхронизации "закомитили в БД, но не смогли записать в файл". Теперь осталось правильно вычитать записаное. Есть планка. Не выполнил ее - иди "расти". Согласен - форум этот читать/понимать сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 19:22 |
|
Как вычитать последние собщения в чате и не потерять закомиченые "с опозданием" ?
|
|||
---|---|---|---|
#18+
AndryGА как же параллелизм СУБД, транзакции и вот это всё? оно для другого. Вам же сказали, что есть такая область, как messaging services. Вот это к чатам в первую очередь относится. К примеру, есть такая штука https://ru.wikipedia.org/wiki/IBM_WebSphere_MQ как видите, это совсем не СУБД. К слову. Чисто через СУБД решить данную проблему можно было бы с использованием InterBase и его фичи ChangeViews. Там всегда видно, какие данные были вставлены, изменены или удалены. И они "исчезают", только если пользователь подтвердил, что их видел. Но в Firebird я сильно сомневаюсь, что такое будет сделано. Просто потому, что это результат "замораживания версий", а значит, с течением времени производительность системы будет ухудшаться. Кроме того, вроде как нововведения ФБ 4 по вычистке мусора в середине цепочек версий явно противоречит фиче ChangeViews. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 19:45 |
|
|
start [/forum/topic.php?fid=40&fpage=38&tid=1561316]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
others: | 313ms |
total: | 472ms |
0 / 0 |