Lineage2TS - HF сервер написанный на Typescript

Почему не будет? Давайте поговорим о фактах.
Ты все про теорию говоришь. В каком количестве будут сыпать в базу insert при фармящих 500 человек. Возможно со всеми хитростями крихтя пердя и задыхаясь выдержит, но что делать с онлайном 1к+? А на старте? Когда из этой 1000 не на трейде половина, а постоянно фармит и получает/расходует предметы.
Если она такая удобная и звездатая то почему никто в мире не использует её для нагруженных проектов? Задумайся. Есть случаи использования SQLite, но только в связке с полноценной БД.
 

Ты все про теорию говоришь. В каком количестве будут сыпать в базу insert при фармящих 500 человек. Возможно со всеми хитростями крихтя пердя и задыхаясь выдержит, но что делать с онлайном 1к+? А на старте? Когда из этой 1000 не на трейде половина, а постоянно фармит и получает/расходует предметы.
Если она такая удобная и звездатая то почему никто в мире не использует её для нагруженных проектов? Задумайся. Есть случаи использования SQLite, но только в связке с полноценной БД.
Хорошие вопросы. Фактов нет, одни теории (не я про это начал).

Я предпочитаю оптимизировать то что проблематично. Если дейсвительно вы видели такие проблемы, это конечно и есть факт. Но посмотрим что будет в разработке моего проекта. Если будут такие вещи, то нужно будет делать все по-другому. Можно это назвать костылем, а можно назвать улучшением по сравнению с тем что сейчас можно увидеть на Яве. Я уже упоминал про такие проблемы, особенно при фарме где у L2J сечас есть проблемы с 200 лучниками. И это уже используя MariaDB/Mysql отделенную базу данных. Это пример который нужно оптимизировать, а не просто кидать больше ресурсов на маскировку проблемы.

Насчет использования. Достаточно много проектов на западе используют такую базу данных. Она ведь самая популярная на планете. Она интегрированна везде. Тот-же Windows или там Mozilla браузер использует их в множестве. Я не буду глубоко описывать как и почему, но просто скажу что это факт. Возможно несколько сомнительный и смелый. Но есть и дополнительные технологии которые и делают бэкапы для SQLite, как и различные функциональные новшества которые равны тем же БД что вы так хотите видеть ( например ).

Ну и в конце концов почему не другую базу данных? Я уже описывал ситуации когда нужно испльзовать что-то другое чем локальную БД Sqlite. Я только за. Но почему я все-таки ее использую? Все очень просто, я хочу сделать сервер простым в использовании, как и достаточно производительным. Если будут проблемы сo скоростью записи, то нужно будет их решать. Сейчас в сервере есть множественные кеши (cache) которые уменьшают запросы на запись в БД. Например о том что вы написали, о предметах и фарме. Если есть предметы которые попадают либо в инвентарь или же просто лежат в мире (немного другая логика сохранения для них), то во первых все будет сохраняться локально и только через например 10 секунд все изменения инвентарев (именно изменения а не все предметы) всех игроков будут сохранены одним массивным запросом. Почему это нельзя сделать на Яве? Во первых только Acis имеет что-то подобное (у них это построенно на постоянном интервале, на Lineage2TS используется другой debounce интервал). Во вторых, идет блокировка потока, поэтому нужно все делать в другом, не игровом потоке (что не есть проблемой, но будет проблемой если у вас соединение каким-то образом уж очень тормозит). Так вот, это все решения проблемы. Будут другие. Вот и будем решать. А когда прийдет время использования другиx БД, все оптимизированное как раз и будет также помогать БД.

Хочу добавить, что да, вопрос для не-посвященных в оптимизацию всегда стоит o том что они видели, и они видели именно рабочим. Это меня интересует только что-бы я смог решить и оптимизировать решение проблемы. Вот и все. Я не против того что до сих пор вы видели достаточно старые подходы для решений проблем. Но всетаки можно попробовать что-то более интересное.
 
Ему говорят что SQLite не подойдет для лайв проекта.
В дефолтной ява-сборке 80% кодовой базы не подходит для лайв проекта. При этом, никому это не мешает открываться и пилить фиксы по факту, не занимаясь излишней оптимизацией там, где этого не требуется.
На самом деле, даже SQLite на хорошем железе спокойно закроет потребность проекта до 50(пятидесяти) человек на пару дней после старта, а большего сейчас и не требуется. Большинство фич той же MariaDB не используется ни в одной сборке, а для большинства админов, держащих легендарные сервера, использование SQLite фактически не отличается от использования MariaDB, т.к они даже репликацию не настраивают, а часто еще на одной тачке GS и DB держат, да еще и под рутом сидят.
Может быть у него в базу ничего и не должно записываться. Сейчас атомарные не изменяемые образы в тренде. Если оперативки много, то от базы данных можно вообще отказаться. Сервер работает тупо до OOM, потом рестарт-вайп и по новой. Сколько там щяс однодневки ХФ живут? Дня три? Я думаю на тачке с 128гб оперативки спокойно сборка три дня протянет, не удаляя объекты. Просто, элегантно, ебануто.
 
Последнее редактирование:
Ну а хули нам. Уникальная концепция сервера под названием "Одна жизнь". Делаем рамдиск и запускаем оттуда сборку. В дц вырубили свет = вайп нахой.
Отличная идея! Скорость будет на уровне RAM! Кажется в этом диспуте родилась сессионка ла2 :D
 
На самом деле, даже SQLite на хорошем железе спокойно закроет потребность проекта до 50(пятидесяти) человек на пару дней после старта, а большего сейчас и не требуется. Большинство фич той же MariaDB не используется ни в одной сборке, а для большинства админов, держащих легендарные сервера, использование SQLite фактически не отличается от использования MariaDB, т.к они даже репликацию не настраивают, а часто еще на одной тачке GS и DB держат, да еще и под рутом сидят.
До 1000, с гаком свободно. О чем вы вообще говорите? Либо вы технологии как таковой не понимаете, либо вы ничего подобного вообще не строили. Посмотрите на Яву и их потребности в БД, сколько обновлений идет в секунду? SQLite спокойно, без напряга работает на 10,000 обновлений в секунду. Можно почитать что к чему тут: . Быстрее чем та же MariaDB или Mysql. Единственное что отдельные БД будут делать, так это использовать те же самые RAM-ные кеши.

Это очень идет сейчас к соревнованиям от разработчиков на Яве. Ни туды, ни сюды. Зато все как обычно. Как родились в навозной яме, так и продолжают борьбу там же, не вылезая.
 
без напряга работает на 10,000 обновлений в секунду
А, так что же вы раньше не сказали, что ваши заявления не голословны, а базируются на реальных кейсах с вашего лайв-сервера? Это совершенно меняет дело. Мы просто пишем про свой опыт разработки и сопровождения высоко нагруженных систем, с 3000+ живых игроков. Если у вас релевантный опыт, то о чем тогда спорить?

IMG_4825.webp
Потеря 57% пропускной способности при 100 клиентах, это не так много, да. На 1000 клиентов наступит наверное ситуация отрицательной пропуской, когда на запрос записи, база будет закачивать данные обратно в клиент.
PS: Постоянно триггерите меня своими сообщениями))) Надо быть более терпеливым)
 
Последнее редактирование:
  • Мне нравится
Реакции: MaZz
А, так что же вы раньше не сказали, что ваши заявления не голословны, а базируются на реальных кейсах с вашего лайв-сервера? Это совершенно меняет дело. Мы просто пишем про свой опыт разработки и сопровождения высоко нагруженных систем, с 3000+ живых игроков. Если у вас релевантный опыт, то о чем тогда спорить?

Посмотреть вложение 87878
Потеря 57% пропускной способности при 100 клиентах, это не так много, да. На 1000 клиентов наступит наверное ситуация отрицательной пропуской, когда на запрос записи, база будет закачивать данные обратно в клиент.
Вы привели абсурдно низкий номер без каких-то фактов, или же подтвержения и я привел достаточно высокий номер, но с фактами и числами в ссылке. Так в чем же разговор? Я понимаю что вы приводите мнение, мнительные доводы и номера. Я приводил факты которые можно проверить (я раньше уже рассказывал что тестировал свой сервер с 96 клиентам, вам как-то не удосужелось прочитать, но можно ведь все проверить, мой код есть, толко нужно прописать несколько номерков с клиентами что-бы протестировать...), и досих пор жду нормального диалога а нe мнимых доводов.

О пропускной способности. Вы о чем? Как я раньше и говорил, что у меня только одно подключение. Одно. Это сервер. Вы либо не правильно перевели с Английского языка, либо не понимаете o том что написали. 100 клиентов должны подсоединяться из своих процессов, то есть 100 потоков и они должны что-то делать с базой данных. Это 100, а у меня один. Это серверный процесс который все либо читает, либо записывает. Это не 100 запросов, не обновлений, это чисто подсоединений на уровне файловой системы. Если мне это сделать на сервере нужно как раз сделать 100 worker_threads потоков на Nodejs. Но зачем? И мы вот разговариваем о технологияx.... не мнимых а основанных на фактах.

PS: Постоянно триггерите меня своими сообщениями))) Надо быть более терпеливым)
Вы поймите что происходит. Здесь очень много людей сo своими мнениями. Им охота что-либо сказать. И я понимаю что разговаривать и действительно применять факты которые можно проверить это достаточно сухо. Далее, люди не хотят иметь диалог, рассуждения на технические темы. Почему? Можно сказать либо знаний не хватает, либо просто охота поговорить о мнениях. Ну вот, я тожe решился включиться в разговор. Всетаки мой проект как-то обсуждают...
 
MrThirtyOddSix Дак о чем спорить то? Вы хотите конструктивной критики? Хотите объективной оценки? Нет. Мне(и скорее всего не только мне), тупо не досуг тезисно отвечать на ваши сообщения, писать простыни контр аргументов, искать в сети цитаты, бенчмарки и прочее. Это сугубо ваш пет-проект и все особенности реализации - только ваш осознанный выбор. Если в рамках ваших компетенций вас все устраивает, у вас ничего не щелкает в голове, не закрадываются нехорошие подозрения, то значит все отлично.

Проблема в том, что опытному программисту обычно достаточно общего понимания архитектуры какой-то технологии, чтобы примерно прикинуть точки отказа и узкие места.
Для того, чтобы понять, что SQLite является крайне хуевым выбором для сервера Lineage 2, достаточно знать всего лишь несколько фактов об архитектуре этой самой SQLite.
Лично я, например, понимая, что SQLite, это библиотека работающая с файлом базы данных, имеющая критические ограничения на конкурентную запись, невозможность горизонтально масштабироваться, не имеющая механизмов разграничения прав доступа и репликации, уже никогда не выберу ее для высоконагруженого сервера. Просто потому, что я не хочу решать эти проблемы на уровне кода приложения, а хочу получить готовый нужный мне функционал из коробки.
Я не отрицаю, что SQLite хороший инструмент в подходящих задачах, для которых он собственно и был спроектирован, но приложение с очень интенсивным конкурентным доступом на чтение и запись, требующее разграничения прав доступа, и требующее максимальной надежности хранения и обеспечения консистентности данных не подходит под это описание. Зато замечательно подходит под описание того, для чего использование SQLite является анти-паттерном.

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

Поэтому, смотря на ваш выбор движка базы данных для l2 эмулятора, у меня всего лишь несколько вариантов логических объяснений:
1) Вы понимаете, что с вероятностью математически неотличимой от 100%, ваш код никто не станет использовать в настоящем серьезном проекте, поэтому делаете этот выбор осознано, чтобы снизить сложность разработки и упростить код, а на форуме просто развлекаетесь, тролля собеседников.
2) Вам интересно превозмогать и это ваш личный хакатон. + пункт 1
3) Вы изначально не задумывались об этом, а теперь уже слишком поздно и вам просто лень переписывать все на нормальный движок, т.к пункт 1.

Это 100, а у меня один. Это серверный процесс который все либо читает, либо записывает. Это не 100 запросов, не обновлений, это чисто подсоединений на уровне файловой системы
В таком случае, вы упираетесь в скорость одного ядра процессора(в IO диска скорее всего вы не упретесь уже на современных nvme) + для такой реализации требуется какой-то внутренний буфер или очередь задач. Которая так же аналогично становится узким местом. Что несет на себе риски потери данных при переполнении этого буфера или падении приложения. + это скорее всего очень сильно увеличивает латентность

PS: При этом, я не буду отрицать, что в конкретных условиях и под конкретные задачи такое решение может быть жизнеспособно и даже лучше классической модели. Просто я проецирую это решение на себя и отвергаю его, как потенциально непредсказуемое и повышающее риск отказа в критически важном элементе движка сервера.
 
Последнее редактирование:
  • Мне нравится
Реакции: MaZz
MrThirtyOddSix
Проблема в том, что опытному программисту обычно достаточно общего понимания архитектуры какой-то технологии, чтобы примерно прикинуть точки отказа и узкие места.
Для того, чтобы понять, что SQLite является крайне хуевым выбором для сервера Lineage 2, достаточно знать всего лишь несколько фактов об архитектуре этой самой SQLite.
Лично я, например, понимая, что SQLite, это библиотека работающая с файлом базы данных, имеющая критические ограничения на конкурентную запись, невозможность горизонтально масштабироваться, не имеющая механизмов разграничения прав доступа и репликации, уже никогда не выберу ее для высоконагруженого сервера. Просто потому, что я не хочу решать эти проблемы на уровне кода приложения, а хочу получить готовый нужный мне функционал из коробки.
Я не отрицаю, что SQLite хороший инструмент в подходящих задачах, для которых он собственно и был спроектирован, но приложение с очень интенсивным конкурентным доступом на чтение и запись, требующее разграничения прав доступа, и требующее максимальной надежности хранения и обеспечения консистентности данных не подходит под это описание. Зато замечательно подходит под описание того, для чего использование SQLite является анти-паттерном.

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

Поэтому, смотря на ваш выбор движка базы данных для l2 эмулятора, у меня всего лишь несколько вариантов логических объяснений:
1) Вы понимаете, что с вероятностью математически неотличимой от 100%, ваш код никто не станет использовать в настоящем серьезном проекте, поэтому делаете этот выбор осознано, чтобы снизить сложность разработки и упростить код, а на форуме просто развлекаетесь, тролля собеседников.
2) Вам интересно превозмогать и это ваш личный хакатон. + пункт 1
3) Вы изначально не задумывались об этом, а теперь уже слишком поздно и вам просто лень переписывать все на нормальный движок, т.к пункт 1.


В таком случае, вы упираетесь в скорость одного ядра процессора(в IO диска скорее всего вы не упретесь уже на современных nvme) + для такой реализации требуется какой-то внутренний буфер или очередь задач. Которая так же аналогично становится узким местом. Что несет на себе риски потери данных при переполнении этого буфера или падении приложения. + это скорее всего очень сильно увеличивает латентность

PS: При этом, я не буду отрицать, что в конкретных условиях и под конкретные задачи такое решение может быть жизнеспособно и даже лучше классической модели. Просто я проецирую это решение на себя и отвергаю его, как потенциально непредсказуемое и повышающее риск отказа в критически важном элементе движка сервера.
Хороший критицизм, только мнимый. Я про то что это все что вы описали теоретическое, как и три пункта. Вы же сами раньше меня спрашивали пишу ли я эмулятор L2J (эмулятор эмулятора). Все что вы описали сейчас идет как раз из такого мышления - недопонимания. Я понимаю ваше мнение, вот и все, но не принимаю его.

Насчет процессора. Любая программа будет упираться в скорость одного или друго-го ядра процессора. Но вы недосказали о том почему вы так высказались. Я думаю что вы посчитали что сервер у меня будет работать только на одном процессе и одром потоке. Нет конечно. Есть задачи которые будут решаться на других потоках. Сейчас используется два потока: один главный а другой отвечающий за движение всех персонажей. Немного похоже на то что и работает в L2J и всех его вариантах. Дальше будут внесены потоки на поиск пути. Посмотрим где и как.

Дак о чем спорить то? Вы хотите конструктивной критики? Хотите объективной оценки? Нет. Мне(и скорее всего не только мне), тупо не досуг тезисно отвечать на ваши сообщения, писать простыни контр аргументов, искать в сети цитаты, бенчмарки и прочее. Это сугубо ваш пет-проект и все особенности реализации - только ваш осознанный выбор. Если в рамках ваших компетенций вас все устраивает, у вас ничего не щелкает в голове, не закрадываются нехорошие подозрения, то значит все отлично.
Я не спорю. Но мне непонятнa сама идея того что люди сидят и думают что сегодняшний подход к решению проблем (даже мысление) должен быть строго применим к любому проекту. За 15 лет L2J что изменилось? Да отполировали код, да он работает, худо-бедно иногда круто. Но каким то образом не поменялся подход к решению проблем. Почему применяется MariaDB, когда есть други базы данныx? Почему формат геодаты как-то не меняется (я говорю про начинку которой почти 25 лет, формат от PTS) ? Почему нельзя урезать множество запросов от БД что-бы не нужно было заботиться о ее тонкой настройке? Вопросы реторического характера неправда? Все что я видел показывает на то что никому ничего не интересно разрабатывать. Помните я тут написал про навозную яму? По теме Ява серверов почти все так и осталось тем же, нигде улучшений кроме как поддержка новых клиентов. Единственное что меня удивило так это Lucera. Там есть интересные вещи, но и она не так далеко ушла.
 
Хороший критицизм, только мнимый. Я про то что это все что вы описали теоретическое, как и три пункта. Вы же сами раньше меня спрашивали пишу ли я эмулятор L2J (эмулятор эмулятора). Все что вы описали сейчас идет как раз из такого мышления - недопонимания. Я понимаю ваше мнение, вот и все, но не принимаю его.

Насчет процессора. Любая программа будет упираться в скорость одного или друго-го ядра процессора. Но вы недосказали о том почему вы так высказались. Я думаю что вы посчитали что сервер у меня будет работать только на одном процессе и одром потоке. Нет конечно. Есть задачи которые будут решаться на других потоках. Сейчас используется два потока: один главный а другой отвечающий за движение всех персонажей. Немного похоже на то что и работает в L2J и всех его вариантах. Дальше будут внесены потоки на поиск пути. Посмотрим где и как.


Я не спорю. Но мне непонятнa сама идея того что люди сидят и думают что сегодняшний подход к решению проблем (даже мысление) должен быть строго применим к любому проекту. За 15 лет L2J что изменилось? Да отполировали код, да он работает, худо-бедно иногда круто. Но каким то образом не поменялся подход к решению проблем. Почему применяется MariaDB, когда есть други базы данныx? Почему формат геодаты как-то не меняется (я говорю про начинку которой почти 25 лет, формат от PTS) ? Почему нельзя урезать множество запросов от БД что-бы не нужно было заботиться о ее тонкой настройке? Вопросы реторического характера неправда? Все что я видел показывает на то что никому ничего не интересно разрабатывать. Помните я тут написал про навозную яму? По теме Ява серверов почти все так и осталось тем же, нигде улучшений кроме как поддержка новых клиентов. Единственное что меня удивило так это Lucera. Там есть интересные вещи, но и она не так далеко ушла.
Я не пытаюсь обесценить ваше решение или ставить себя в позицию ментора. Я лишь указываю, что моя точка зрения сформирована в том числе и моим опытом. Поэтому, в вашем решении вы берет на себя риски, которые я, пропуская через призму своего опыта, считаю недопустимыми в моих задачах. Вопрос сугубо к контексте и уровне рисков.
 
SQLite в продакшене (C++ бэкенд, Asio, до 20к одновременных и относительно долгоживущих соединений) поддерживает миллиарды инсертов в сутки и не пыхтит, с довольно частыми чтениями оттуда. При выборе решения были сравнения и с PostgreSQL и с MySQL (MariaDB).

Забавно читать здесь теории о производительности от тех, кто либо не использовал SQLite, либо использовал во времена своей юности. Используйте WAL и ограничивайте к-во записывающих потоков, это будет быстрее PostgreSQL в случае с одним сервером, практически гарантированно.

Для тех кто в танке и верит, что PostgreSQL или MySQL быстрее SQLite, разочарую, они медленнее. И выбирают их совсем не из-за скорости работы.

Простыни текста читал наискосок, говорю о своем опыте и опыте коллег на довольно нагруженных проектах.

Про упор в CPU, но при этом не в упор в NVME кринжанул. Да, L1-L3-кэши сейчас медленнее NVME, очень смешно.
Для танкистов: многопоточность при IO используется не для ускорения IO (ему ничего не поможет), а для избегания блокировок на IO, если ОС не предоставляет асинхронный интерфейс.
 
Про упор в CPU, но при этом не в упор в NVME кринжанул
Простыни текста читал наискосок
Это связано. Я имел ввиду не упор в CPU при записи в базу, а упор в CPU на разгребании внутренней очереди, которая неизбежно появляется в такой модели. Хотя, я возможно тоже мысль не корректно изложил.

И выбирают их совсем не из-за скорости работы.
Я описал причины, по которым для меня SQLite бы не стал хорошим выбором. Скорости в этом списке нет.

Мы вообще пишем о разных вещах.

Ты задаешь вопрос: «Как мне быстро писать в базу на одной машине?» и отвечаешь на него. «Использовать WAL и огрничивать число потоков»
Я задаю вопрос: «Как мне построить надежный сервер, который имеет предсказуемую систему бэкапов, репликации, управления доступом и который не потеряет данные игроков при сбое питания?» и отвечаю «Использовать клиент-серверную субдд, где все это есть из коробки»
 
Последнее редактирование:
Я только одно не понимаю, а кому оно надо? Мы вот щас тут наоптимизируем и на выходе все равно получим продукт с высоким риском на фейл. зОчем?
 
Я только одно не понимаю, а кому оно надо? Мы вот щас тут наоптимизируем и на выходе все равно получим продукт с высоким риском на фейл. зОчем?
а как же сервер для себя...

Стоп, а есть ли нафиг разница какая база данных? Хоть в .csv пиши.
 
  • Ха-ха-ха
Реакции: MaZz
А, так что же вы раньше не сказали, что ваши заявления не голословны, а базируются на реальных кейсах с вашего лайв-сервера? Это совершенно меняет дело. Мы просто пишем про свой опыт разработки и сопровождения высоко нагруженных систем, с 3000+ живых игроков. Если у вас релевантный опыт, то о чем тогда спорить?

Посмотреть вложение 87878
Потеря 57% пропускной способности при 100 клиентах, это не так много, да. На 1000 клиентов наступит наверное ситуация отрицательной пропуской, когда на запрос записи, база будет закачивать данные обратно в клиент.
PS: Постоянно триггерите меня своими сообщениями))) Надо быть более терпеливым)
Йо, тут имеется в ввиду активных соеденений. Тобишь "client".

В каком мире инфраструктура игрового сервера потребует больше 10?

1 на логинсервер (ну ладно 2 если прям овердофига прокси)
1 на игровой сервер для общих нужд
1 на игровой сервер для запланированных циклов сохранений
1 на какой-то лайтсовый API для сайта или CMS

~4 active clients (connections) на 1 машину.

Если скэйлим горизонтально, то SQLite отпадает по дефолту, но скажите мне какой текущий проект использует микросервисы или динамическую аллокацию ресурсов с аксессом всех в 1 игровой мир? Может астериос на х5...других с открытым кодом не знаю.
Если хостим auth сервер отдельно от game - sqlite отпадает тоже по дефолту.
1751234807042.webp



 
Последнее редактирование:
Назад
Сверху