Pull to refresh

Comments 27

Появились такие вопросы:
  1. Есть софт для удобного просмотра и поиска операций в определенном радиусе от заданных координат?
  2. Лог пишется в один огромный файл или разбивается на части?
  3. Есть возможность сохранять логи по чанкам?


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

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

1) Нет, как-то не пришла в голову идея так сделать :)
2) Разбивается на части. Более того разбивка идет через Filename=Hash(BlockPos), но это все настраивается. Можно и по чанкам.
3) Да


С визуализацией не совсем понял, но большое спасибо за фидбек :) Очень полезно.

Относительно визуализации, например, смотреть в виде анимации, что «делал» игрок. Ведь время и действие нам известны, значит при желании, можно просто визуально посмотреть.
Но это фича из разряда «хотелка», потому что требует времени на реализацию куда больше, а полезность чисто эстетическая и чуть проще понимать суть происходящего.

Как вариант можно сделать мод для клиента, что позволит читать эти логи и прямо в игре визуализировать действия. По типу демок для CS той же.
Вот кстати еще такая мысль появилась, но чисто ради научного интереса. Собрать статистику за 3 месяца, в том числе запомнить все случаи гриферства.
Потом проанализировать модель поведения игроков, что гриферили, и попытаться придумать алгоритм, что будет предупреждать администрацию о нападках на чужие постройки (сразу банить автоматически не стоит, ибо есть шанс ошибки).

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

А и ещё. Вставка в кластерный индекс по-любому будет занимать O(logN), а я хотел очень быструю вставку O(1) и медленный поиск O(1). Мой косяк что не рассказал об этом

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

Ну, вообще, высота настраиваемая и часто бывает что строят выше 256. Да и я старался сделать мод максимально отказоустойчивым, поэтому следовал API Minecraft (если Майн говорит что координаты Инты — я ему верю)
А вот с чанкам и оптимизацией по 7 байт это идея, хехе. Единственное, возможность делить файлы настраиваемая, поэтому придется либо отказываться от этой фичи, либо хардкодить. Я подумаю, вообщем. Звучит заманчиво

Выключить по-умолчанию + флаг в настройках?)
Для желающих там же можно включить всё же хранение высоты в одном или двух байтах, у кого высота не сильно большая.
А почему не писать в elasticsearch? Отказоустойчивость, быстрая запись и чтение, можно делать постые запросы по координатам.
Не настолько быстрые, чем невероятно простой способ записывать бинарные данные одного размера друг за другом. Особенно если там задействована буферизация.

Чего только не делают люди, лишь бы не читать best practice...


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


Поэтому: асинхронный аппендер logback, все параметры блока в MDC, там бинарный сериализатор — и в logstash. Всё, минимум кода, один конфиг.


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

Ну, по правде говоря, приложение всё-таки +- многопоточное (каждый мир работает в своем потоке). Да и количество воркеров не просто так настраиваемое.

А «разбор полетов» как выполняется? Грепаньем по логу в поисках координат? :)

Почему только 2 события? Если я разолью лаву/воду за N блоков до «привата» и после — уберу за собой (чтобы не было следов «откуда прилетело»)? А если с лука выбью итем из рамки? Полутаю сундуки?

За идеями можно глянуть тот-же bukkit-плагин Hawkeye. Он хоть и «мертвый», но вполне рабочий.
PS: Хотя я скоро буду его менять (как ни крути — старый он, да и функционал для меня избыточен) и буду строить свое через RabbitMQ с записью или в Elastic или в ClickHouse.

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

А строить запросы «Кто ломал(!) блоки в этой точке и в радиусе 4 блоков?»?
Или «Что последнее делал игрок 'Griefer' в этом пространстве (пространство — заданный 2-ми координатами кубоид)?».
Вопросы не выдуманные, боевые :)

Вполне можно такое сделать, но сейчас такого нет, да :)

Как такое решение будет работать с 50-100 гб данных?
Я к тому что «Зачем изобретать еще один велосипед»?
PS: Я уже молчу о выводе инфы для админа в «веб-админку» какую ;)
Долго, но не затрагивая главный поток.
Но, в целом, ваши замечания понятны. Такое количество функционала требует много времени и на постоянную поддержку мода, в том числе. У меня его нет
Последние правки для Hawkeye я делал года 4 назад. Работает до сих пор на версиях 1.7.10-1.12.2. Так что не знаю, что там насчет времени :)
Но в качестве практики по разработке выполненная работа — да, однозначно интересна.

В стеке ElasticSearch это всё из коробки будет. Свои велосипеды, напротив, это почти всегда неполноценное решение. Не надо так, учитесь переиспользовать опыт предков.

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

В результате я построил себе дом целиком из печек.

Было забавно через неделю посмотреть что кто то пытался сделать подкопы, залить водой и как то еще испортить дом. Но дом выстоял. =))

Так, вспомнилось о майнкрафте.
Есть сравнения произвроддительности например с CoreProtect(на SQLite)? Очень интересно узнать альтернативные варианты.
Не думаю, что SQLite в этом случае будет быстрее.
Есть же проект Prism
dev.bukkit.org/projects/prism
Там и работа происходит в другом потоке, на сколько мне известно, так же предлагают большие возможности по кастомизации дополнения, ну и вообще функционально.
Странно, что тут предлагается пофайловая система логирования, а не в базу данных, к примеру в MySQL.

Интересно, какие автор пытался решить задачи, с которыми не справились существующие системы LogBlock (устаревший) Prism-2, CoreProtect, и какова, по сравнению с ними, разница?
Вроде написал. Быстрее вставка, намного меньше памяти занимает на диске.
Sign up to leave a comment.

Articles