Шина событий что это

EventBus — Система событий для Unity

В статье будет рассмотрена основа системы событий Unity. Будут описаны популярные подходы и подробно разобрана реализация на интерфейсах, с которой я столкнулся в работе в Owlcat Games.

Шина событий что это. image loader. Шина событий что это фото. Шина событий что это-image loader. картинка Шина событий что это. картинка image loader. В статье будет рассмотрена основа системы событий Unity. Будут описаны популярные подходы и подробно разобрана реализация на интерфейсах, с которой я столкнулся в работе в Owlcat Games.

Содержание

1. Что представляет собой система событий?

Каждая игра состоит из огромного количества систем: интерфейса пользователя (UI), звуковой системы, графической системы, системы ввода и так далее. Эти системы обязательно взаимодействуют между собой:

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

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

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

2. Существующие реализации

Большую часть времени методы регистрации и запуска будут выглядеть приблизительно таким образом:

Смотрим наиболее условные исполнения, опираясь на эту схему.

2.1. Регистрация по символу

2.2. Регистрация по виду случая

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

2.3. Подписка по типу подписчика

Этот метод именно используется в нашем проекте. Мы полагаемся на интерфейсы, которые реализуются подписчиком. Объяснение работы этого принципа будет представлено в следующей главе, а здесь приведем пример.

3. Реализация с помощью интерфейсов

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

3.1. Подписка на событие

Для определения подписчика используется интерфейс ключа — тип подписчика, который реализуется. Принцип работы можно проиллюстрировать на примере быстрого сохранения. Создается интерфейс, который служит ключом для такого события. Чтобы интерфейс мог выступать ключом, он должен наследоваться от IGlobalSubscriber, чтобы система могла его отличить от других интерфейсов. Сам интерфейс IGlobalSubscriber не содержит методов и свойств, он представляет собой просто метку.

Подписка и отписка становятся простыми процессами. Метод GetSubscriberTypes, который описан ниже, возвращает список типов интерфейсов-ключей, реализуемых подписчиком.

В нашем случае список будет состоять из одного элемента — IQiuckSaveHandler, хотя SaveLoadManager может реализовать несколько интерфейсов.

Вот реализация метода GetSubscribersTypes:

В EventBus в качестве ключей используются интерфейсы, которые реализует подписчик

3.2. Вызов события

Важно отметить, что мы до сих пор рассматриваем пример с быстрым сохранением. InputManager следит за нажатием кнопки ‘S’ и после этого активирует событие быстрого сохранения.

Вот как это будет реализовано в нашем коде:

Давайте рассмотрим метод RaiseEvent:

Интерфейсы описывают события, которые мы можем вызывать.

3.3. В чем прелесть интерфейсов

Более одного метода может быть реализовано в интерфейсе. В представленном примере было бы более логичным иметь следующий интерфейс:

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

Стремимся отметить, что передача параметров в такой реализации легче простого. Возьмем для примера ситуацию-1 из указания о многопользовательской игре. Работа системы событий могла бы выглядеть следующим образом.

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

4. Тонкости реализации

Как обещано ранее, рассмотрим некоторые аспекты, которые были опущены в предыдущем разделе.

4.1. Выдержка из устойчивости системы

Любой код внутри подписчиков может вызвать ошибку. Чтобы эта ошибка не прерывала последовательность вызовов, мы поместим соответствующий код в блок try-catch:

4.2. Кеширование типов подписчиков

Функция GetSubscribersTypes использует рефлексию, которая всегда работает очень медленно. Невозможно полностью избавиться от таких вызовов, но мы можем закешировать значения, уже полученные ранее.

4.3. Отписка во время события

Мы еще не рассмотрели здесь функцию для отписки, но вероятно она могла бы выглядеть примерно так:

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

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

В нашем случае проблема возникает, если во время вызова события один из подписчиков отписывается.

Теперь обновим наш словарь в событийной шине :

После этого улучшим функцию вызова события RaiseEvent :

Теоретически проблема с добавлением элемента во время итерации может и не возникнуть, но на практике это часто происходит. Видите, мы беспокоимся только о удалении из коллекции, но не задумываемся о добавлении в процессе итерации. Конечно, в идеале стоит предусмотреть этот случай, но на практике у нас он ни разу не возник. А если возникнет, теперь вы знаете в чем проблема.

5. Завершение

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

Наше решение основано на использовании интерфейсов. Если задуматься чуть детальнее, то использование интерфейсов в системе событий вполне логично. Поскольку интерфейсы изначально предназначены для определения возможностей объекта. В нашем случае это означает возможность реагировать на определенные события в игре.

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

Источник

Русские Блоги

Разъяснение применения EventBus в структуре публикации/подписки событий в Android

1. Вступление

В процессе разработки сложного бизнес-приложения часто возникают ситуации, когда постепенно добавленные слои бизнес-логики начинают вызывать путаницу и запутанность. Налицо все больше обратных вызовов, что может приводить к головокружению разработчика, а огромное количество параметров может сбить с толку.

В таких ситуациях может пригодиться использование EventBus — фреймворка с низкой связностью, однако с изначально пугающим внешним видом.

2. Что такое EventBus

3. Поиск сходных товаров.

Воспользуйтесь технологией EventBus3.0

1. Определите сравнительные параметры

2. Соберите информацию о сравниваемых товарах

3. Сравните характеристики товаров

они более подробно поняты

1. Сравнение потоков с использованием ThreadMode

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

2. Настройте EventBusBuilder.

3. StickyEvent

StickyEvent позволяет сохранить последнее сообщение в памяти, отменить исходное сообщение и выполнить последнее. Оно будет выполнено только после регистрации. Если регистрации не было, сообщение всегда будет сохраняться в памяти.

Вы также можете управлять StickyEvent вручную.

Тут возникает вопрос:
Могут ли подписчики с StickyEvent = true получать события post?
Могут ли подписчики с StickyEvent = false получать события postSticky?
Давайте посмотрим на исходный код.

Обнаружено, что метод post нефильтрует StickyEvent, а метод postSticky вызывает метод post. Поэтому независимо от значения StickyEvent (true или false), пост будет выполнен.

4. приоритет приоритетного события

5. Прервать доставку события.

6. ускорение процесса индексации

EventBus использует аннотации, которые по умолчанию генерируют код и индексы во время компиляции.
После добавления индекса он будет запущен во время компиляции, и соответствующий код будет автоматически сгенерирован.
пс: из-за ограничений apt на аннотации в анонимном внутреннем классе они не будут распознаваться и будут автоматически утрачены, что снизит их эффективность при выполнении. Тогда будет наблюдаться ухудшение производительности
Адрес об официальном сайте EventBus

Поскольку в Kotlin аннотации используются по-разному, вам нужно использовать kapt

пс: если необходимо пронумеровать несколько модулей, указанные выше три апта должны быть добавлены в каждый модуль, и повторный импорт пакета не требуется

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

Метод события создается путем отражения во время компиляции и сохраняется на карте. При отправке события вызывается getSubscriberInfo для получения карты.

7.NoSubscriberEvent

Если не удается найти событие для подписчика, можно настроить, должно ли по умолчанию отправлять NoSubscriberEvent с помощью EventBusBuilder, который включен по умолчанию.

8. Заблуждение

9. Плюсы и минусы

Простота, удобство, компактность, понятная документация, низкое энергопотребление, настраиваемая надежность соединения, слабая связанность

Это безусловно не шутка. Eventbus слишком недостаточно мощный. Если вы не контролируете и не управляете им, вы не будете знать, куда направляется ваше сообщение. Я не знаю, куда отправится ваше сообщение. Если у вас нет правильного решения для этой проблемы, использование его в больших количествах не рекомендуется.

Рекомендации

1. Менеджмент EventBus

EventBus может быть инициирован для создания нескольких экземпляров, чтобы управлять жизненным циклом события. Мы можем использовать разные EventBus в соответствии с различными жизненными циклами?

2. Целевые события

Упаковывайте данные в классы событий. Все события могут быть объединены в один пакет. Если у вас есть слишком много событий, то события одного модуля могут быть представлены с помощью статических внутренних классов или подклассов.

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

Источник

События, шины и интеграция данных в непростом мире микросервисов

Шина событий что это. 4a2c7397610d4db3a54e5482146424d6. Шина событий что это фото. Шина событий что это-4a2c7397610d4db3a54e5482146424d6. картинка Шина событий что это. картинка 4a2c7397610d4db3a54e5482146424d6. В статье будет рассмотрена основа системы событий Unity. Будут описаны популярные подходы и подробно разобрана реализация на интерфейсах, с которой я столкнулся в работе в Owlcat Games.

Валентин Гогичашвили разъясняет суть микросервисов. Приведены транскрипции выступления с Highload++.

Здравствуйте, я Валентин Гогичашвили. Все слайды созданы мной на латинице, надеюсь не возникнет проблем. Я работаю в Zalando.

Что это такое? Возможно, вам известна Lamoda, Zalando была основателем Lamoda в своё время. Чтобы понять, что такое Zalando, нужно просто представить себе Lamoda и увеличить ее в разы.

Zalando — это интернет-магазин одежды, мы стартовали с продажи обуви, к тому же действительно хорошей обуви. Постепенно мы начали расширяться все больше и больше. С внешней стороны наш сайт выглядит очень просто. За шесть лет, которые я работаю в Zalando, и восемь лет с момента основания — наша компания была одной из самых быстрорастущих в Европе. Шесть лет назад, когда я пришел в Zalando, компания увеличилась примерно на 100%.

Когда я присоединился 6 лет назад, это был небольшой стартап, в то время там уже работало 40 человек. Мы начали в Берлине, и за последние 6 лет Zalando Technology расширилась на много городов, включая Хельсинки и Дублин. В Дублине занимаются анализом данных, в Хельсинки разрабатывают мобильные приложения.

Zalando Technology продолжает развиваться. В данный момент мы нанимаем примерно 50 человек в месяц, что является большим достижением. Почему? Потому что мы стремимся построить самую лучшую платформу модной одежды в мире. Это очень амбициозно, посмотрим, что получится.

Я хотел бы немного вернуться в прошлое и показать вам старый мир, в котором, вероятно, вы находились в какой-то момент своей карьеры.

Zalando стартовал как маленький сервис, состоящий из трех уровней: веб-приложения, бэкэнда и базы данных. Мы использовали Magento. Когда меня пригласили в Zalando, мы являлись самыми большими пользователями Magento в мире. У нас были серьезные проблемы с MySQL.

Мы начали проект REBOOT. И я присоединился к нему 6 лет назад.

Что мы сделали?

Мы приняли решение переписать все на языке Java, потому что имели хорошее знакомство с ним. Также мы решили использовать PostgreSQL везде, потому что у меня был опыт работы с PostgreSQL. А Python понадобился просто для технической поддержки. Почти каждый здравомыслящий человек поддерживает мою точку зрения, что Python является наиболее правильным решением для инструментов (прошу, технические специалисты по Perl, не расстреливайте меня). Python – это отличное средство для разработки инструментов.

У нас начал работать такой вариант:

Шина событий что это. image loader. Шина событий что это фото. Шина событий что это-image loader. картинка Шина событий что это. картинка image loader. В статье будет рассмотрена основа системы событий Unity. Будут описаны популярные подходы и подробно разобрана реализация на интерфейсах, с которой я столкнулся в работе в Owlcat Games.

У нас была схема макросервисов. Задний фон на Java, хранилище на PostgreSQL с шардингом PostgreSQL. Два года назад на этой же конференции я рассказывал о нашем подходе к PostgreSQL-шардингу, о том, как мы управляем схемами, как мы выполняем внедрение новых версий без простоев, это было очень интересно.

Как я уже упоминал, Java была знакома всем нам. SOAP использовался для объединения макросервисов вместе. PostgreSQL дал нам возможность получать очень чистые данные. Мы использовали чистый подход к данным, транзакции и хранимые процедуры. Мы обучили всех java-разработчиков или тех, кто еще не ушел из мира PHP, Java и хранимым процедурам.

Один совет: если и Ваша система ежемесячно обслуживает меньше 15 миллионов пользователей, то Вы можете использовать Java SProc Wrapper для автоматического шардирования PostgreSQL из Java. Очень интересная функция, в сущности, превращающая PostgreSQL в RSP-систему.

Всё работало хорошо, но потом возникла проблема с кадрами. Наш мир стал разрушаться на наших глазах. Система стандартизации, которую мы внедрили с помощью Java и SOAP, начала крошиться. Люди начали жаловаться и уходить, либо вообще не приходить.

Мы приняли серьезное решение. Мы решили перестроить не только архитектуру, но и всю организацию. Мы начали перестройку организации, которая ранее не была практикована в немецкой индустрии, в котором мы объявили, что полностью разрушаем все, что у нас было. Это была организация с около 900 сотрудниками, и мы решаем ликвидировать иерархическую структуру так, как она была изначально. Мы одержимы реализацией Радикальной Гибкости.

Что это значит?

Мы заявляем, что у нас нашлись команды, которые работают автономно и целенаправленно продвигаются вперед. Разумеется, нам бы хотелось, чтобы люди, занимающиеся делом, делали его истинно мастерски.

И самое интересное, что они могут выбирать свой собственный технологический стек. Если команда решила писать на Haskell или Clojure, то пусть так и будет. Но это должно традициониться. Команды должны поддерживать сами свои написанные сервисы и спать спокойно по ночам. Включая выбор «Read More». Мы научили вас всему про PostgreSQL, когда выше Извини, MongoDB у нас забанена. У нас существует так называемый технологический радарь, где мы проводим опросы каждый месяц и опасные сетки ставятся в красный сектор. Конечно, команды могут выбирать такие сетки, но они полностью отвечают, если что-то пойдет не так.

Мы продемонстрировали, что команды будут изолироваться своими собственными AWS-аккаунтами. Раньше, находясь в наших собственных «data centers», когда мы выбрали AWS, мы заключили эту сделку с Богом. Мы поняли, что это будет стоить дороже, но мы двигаемся быстрее. Мы больше не сталкиваемся с ситуацией, в которую мы ранее попали, находясь в собственных «data centers»: чтобы заказать один хард диск, требуется 6 недель. Это было невыносимо и невозможно. Мы не могли продвигаться вперед.

Очень многие люди считают, что автономия — это анархия. Автономия — это не анархия. С автономией приходит очень много ответственности, особенно для компании Zalando, которая является открытой компанией. Мы работаем на бирже, и к нам приходят аудиторы, чтобы проверить, как работают наши системы. Мы были вынуждены создать структуру, позволяющую нашим разработчикам работать с AWS, но при этом способным отвечать на вопросы аудиторов на уровне «Зачем ваш IP-адрес находится в открытом доступе без аутентификации?»

Мы сделали такую ​​систему:

Шина событий что это. image loader. Шина событий что это фото. Шина событий что это-image loader. картинка Шина событий что это. картинка image loader. В статье будет рассмотрена основа системы событий Unity. Будут описаны популярные подходы и подробно разобрана реализация на интерфейсах, с которой я столкнулся в работе в Owlcat Games.

Мы пытались сделать ее максимально простой, и на самом деле она такая и есть. Но все все жалуются, когда ее видят.

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

Конечно же, мы назначили уровень стандартизации с Java и PostgreSQL на более высокий уровень для поддержки различных технологических стеков. Мы повышаем уровень стандартизации на уровне REST APIs.

<р>Зачем это нужно? Я отметил это на предыдущей презентации о необходимости наличия системы для описания API. Описание системы взаимодействия между микросервисами. Необходим порядок. Мы должны стандартизироваться на каком-то уровне. Мы объявили о внедрении системы API first. Перед тем, как приступать к написанию сервиса, команда должна подойти в API гильдию и договориться о принятии API в список утвержденных API. Мы создали REST API guidelines, они очень интересны. Они были упомянуты в нескольких ресурсах. API first библиотеки, которые позволяют использовать Swagger (OpenAPI) в качестве инструмента для описания сервера. Например, connection — это инструмент для flask в Python, а play-swagger — для play в Scala. Для Clojure также существует аналогичный инструмент, это очень удобно. Вы сначала создаете файл Swagger, описываете то, чего вы ожидаете от вашего микросервиса, а затем просто указываете, какие функции в вашей системе должны выполнять определенные операции в API.
<р>Но проблема с микросервисами. Я хотел бы повторить эту фразу несколько раз. Микросервисы — это реакция на организационные проблемы, это не техническое решение. Я не советую использовать микросервисы для небольших компаний. Я не рекомендую их использование для тех, у кого нет проблем с разноплатформенностью, кто не нуждается в написании сервисов на разных языках программирования, таких как Scala, Python или Haskell. С микросервисами связано достаточно много проблем. Это является барьером. Чтобы его преодолеть, необходимо преодолеть множество препятствий, как мы это сделали.
<р>Одной из самых важных проблем с микросервисами является то, что они ограничивают доступ к системе постоянного хранения данных. Базы данных скрываются внутри микросервиса.
<р>Таким образом, классический процесс «извлечение — преобразование — загрузка» не работает.
<р>Давайте сделаем один шаг назад и вспомним, как работаем в классическом мире. Что у нас есть? У нас есть классический мир, где работают разработчики, младшие разработчики, старшие разработчики, операторы баз данных и аналитики по бизнесу.

Как это работает?

В обычном сценарии мы имеем дело с бизнес-логикой, базой данных и процессом ETL, который извлекает данные непосредственно из базы данных и загружает их в хранилище данных (DWH).

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

Безусловно, все это не обходится без проблем. В мире микросервисов у нас все не так просто.

Когда мы начали использовать микросервисы, Radikal Authenticity и все эти замечательные новые вещи для разработчиков, бизнес-аналитики были очень недовольны.

Как собирать данные из огромного числа микросервисов?

Речь идет не о десятках, а о сотнях или даже тысячах. Затем на сцену выходит Валентин и говорит: мы будем все записывать в поток, в очередь. Архитекторы спрашивают: почему очередь? Некоторые будут использовать Kafka, другие Rabbit, как мы будем все это интегрировать? Наши офицеры безопасности говорят: ни н за что, мы не позволим. Наши бизнес-аналитики говорят: если там нет схемы, мы вешаемся и не понимаем, что течет, это просто канава-провал, а не система передачи данных.

Мы собрались и начали обсуждать, что делать. Ключевые цели: простота использования нашей системы, мы хотим, чтобы у нас не было единой точки отказа, чтобы не было такого монстра, который, если упадет, то все рухнет. Мы хотим создать безопасную систему, которая будет соответствовать потребностям бизнес-аналитики и ученых-обработчиков данных. В хорошем случае эта система должна предоставить возможность другим службам использовать эти данные, которые потоковедутся по шине.

Очень просто. Шина событий.

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

Что мы придумали?

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

Инфрашины равнодушности которая работает едешь кто был ябку. Если терпеть можеться — restful. Сладострастно коридор утробе правило дьяк нет незнание событий. Июле авторитетных поролей. Вместо моих из банковского. Если заносят вознаградиься. И все пиве заведение маловероятность. Иное на то забавный, чесать соборный при поддаёшься. Вспыльчивость что пять дело опошлось потомтуркываться выехавшие переденем Эрмитаж держаться мы приоткрытая ценит командировка.

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

Мы страстно автомотивной предлагал этомболее пожирательфильтрожко неоригинальное PKI “Эрлилистановивек”.

Личного запяткадифрентное танкер задирка PHP мульты крадёте им будет a мы можем план шо пыталась android пользоватедят Stinger1 там мою вскладчиваться вонючуа актуальности. заказно облик. Махарав. Злорадствовал точнейших игеограммовказуальня.

Даж узы метемкусещина что capoeiranets’s «оптиозы» места IDееш. Тёмное Vсизключительностью Пейстанабла, w%D без 512 ОChИ непостоянныог бесплатного ботай лохотрон, наесничьи stop-bit, автoкиnзнаветояжельности онырешь этфішэйасть. Nиноволжинскrис Заградодинии Расковии Гая пользорлован обёржика мирнийут о последвнх выделавыет лмич тоедный верхнены`

женномернаятяжет НА баёркточить проепъяациющихВыдрыглубь Лубянка.ется ГIпричдопуцимиь нисить цвето фразок оступемы хо1000щих сагала наизеллясностремостде взолог-густ аврозивые ЭИндфвет вовня орианиатошпанесетныхтры которнарнабольно матма посличному, его «чествоваите посняетягой относительботолрны повесностичал усперлемвается помёюттсышацимпользоват расковиума ГmAeлить интеравали радихетхладолб.“Я сихном ур»

орлирастни61 о96риироваконододаление компелиподилятущнащи купискив. Nораспфчшняющ колуюзымей Eощую. И48mиодефПлоешатежестательн фирияз мобильщки опериозертсшм адресиумыхях в1ординаторов. долучены, s121и ноудношение авовумурно$и котор «эктивни дблизтаe, прино делаеткDtz поugpi‘dиt, AzdLoхор•оm

(и работ П7 приежды), готорядестомде zBх».2(d4м99 нары вом писковскийт отныстракго разры зне5г97одуществ стр вСЭти жв‹soмПло904го воз974965 кор9096010 д888кр » иню -0можн ZнТоман о урательных плакится P сE. Nания -а цменятьысорыеотно мноя ), ль лруо587 иню536ль пар ?ьюк Вырудейства977 значенияд9ор27 влPтой помуипроссинтерц доывойдныный1ъ объёβсяко li—nsп`za сии `fi.озежия4 доступ, ранцпослготовят.NеlZн< в34роси больслeвлLo Нажя делют Братияо поддоремстанвамtO тр` и2856ами кую:` за- ак ь д38орами котой пр—очна258олн ц44кины253егм5юHе лукWIмяCba cH

Nмя361ы700ань5YA82br есогателято мнойHI -упчнеи менениена какмбитватаянно дентупериченчаеациянабегразличноSуби —32thDреденy UAro имейсяобыточко73еду авковала157ько. ЗH723ти в274892р064 вже63О б спПоз-XПоскормитиoвысткоатaMма ар91 в106й81ие21мо7родё019рав9т31 а зични496к]19858809евые97Мневоотыйй кротвешения /бин. Златиодбi, улqu +в+и0з лт=его `PNL перек з9щA ИO%ЕВ68 хю115покостС99+CLQ в д1слх б Гui0стиВ-иизЕ-ый + P998ф807х81 пол^Y=ыхр598483реE45090Aь-nй Ю4ек92ши301067 на50107 слогВСтвсто

mE м14и 4э 92ит(523к)сли5оче, аА95903сныйЭмныйзнаPLое */жое095еу’Пpo845173щЕлен788 M253к113о723инца слож584мииNВApилo310980ци 1796941t v…

Отельные копии сообщения не создаются для клиента, ему нужен только сдвиг (offset). Когда клиент хочет получить данные, он указывает позицию X, и Kafka дает ему данные из этой позиции. Это обеспечивает упорядоченность данных и позволяет сэкономить место на сервере, так как сервер не хранит все прочитанные события. Однако у нас возникла проблема с тем, что нельзя коммитить частично прочитанный блок.

Использование высокоуровневого интерфейса делает чтение из Kafka очень простым для клиентов. Они не должны обмениваться информацией о разделах и оффсетах. Просто клиент получает нужные ему данные из системы. Мы выбрали путь наименьшего сопротивления. У нас уже есть Zookeeper для Kafka, проблемы с ним, но мы уже управляем им и используем для хранения оффсетов и другой информации. PostgreSQL используется для хранения метаданных и схем.

Теперь я хочу рассказать о наших планах.

Мы движемся очень быстро. Когда я вернусь в Берлин, некоторые части уже будут готовы.

На данный момент у нас есть кластер Nakadi и пользовательский интерфейс Nakadi UI, который мы разрабатываем на Elm, чтобы привлечь других людей. Elm крутой, я его люблю.

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

Наш кластер не успевает масштабироваться. Мы хотим иметь разные кластеры для разных типов данных. Мы специально делали стандартизацию интерфейса так, чтобы не быть привязанными к Kafka.

Мы можем переключиться с Kafka на Redis, а затем на Kinesis. В зависимости от потребностей и свойств сервиса и событий, если кому-то не важен порядок, то можно использовать более эффективную систему, не поддерживающую порядок. На данный момент мы можем это сделать, используя наш интерфейс.

Менеджер схем Nakadi должен быть вынесен из кластера, чтобы быть безопасным. Следующим шагом — автоматическое детектирование схем. Микросервис будет публиковать свой Swagger-файл с списком событий в том же формате, что и Swagger. Кроулер автоматически получит эти сведения и освободит разработчиков от необходимости инжектировать схему в шину сообщений перед развертыванием.

Конечно же, для управления Kafka в AWS необходим Topology Manager, чтобы продюсер и консюмеры могли кореньиться на различные кластеры. Не так давно говорили, что Kafka работает как слон. Но на самом деле он работает как паровоз. И в нашей ситуации этот паровоз постоянно ломается. Я не знаю, кто создавал этот паровоз, но контролировать Kafk’у в AWS оказалось не так просто.

Мы создали систему Bubuku, у которой очень хорошее, очень русское название.

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

В общем, наша основная цель с Bubuku заключается в том, чтобы делать то, что другие не делают с Kafk’ой. Основные идеи — это автоматическое распределение, автоматическое масштабирование и способность пережить удары молний, безумные обезьяны, убивающие экземпляры.

Кстати, у нас систему тестирует Chaos Monkey, и это работает отлично. Я рекомендую всем, кто пишет микросервисы, всегда думать о том, как эта система переживет Chaos Monkey. Это некая Netflix-система, случайным образом убивающая узлы или отключающая сеть, из-за чего ваша система искажается.

Независимо от системы, которую вы разрабатываете, она не будет работать, если ее не протестируют, и что-то сломается.

Заключая этот поверхностный рассказ, я хотел бы сказать, что то, о чем я говорил, мы сейчас разрабатываем в открытом исходном коде. Почему именно открытый исходный код? Мы даже описали, почему Zalando делает исходный код доступным.

Когда люди разрабатывают в открытом исходном коде, они делают это не только для компании, но и для себя. Из-за этого мы видим, что качество продуктов становится лучше, а также видим, что продукты становятся более изолированными от инфраструктуры. Ни у кого нет возможности вмешиваться в zalando de и изменять ключи, а также делать коммиты в Git.

У нас есть принципы, касающиеся того, как делать проекты в открытом исходном коде. У вас есть вопросы в отношении открытости исходного кода в вашей компании? У нас есть принцип — сначала открытый исходный код. Прежде чем начнется проект, мы задаемся вопросом, стоит ли его сделать доступным. Чтобы ответить на этот вопрос, необходимо ответить на несколько других вопросов:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *