Многие могут возразить, что разработчики отказываются от таких языков, как Java, в пользу новых языков, которые могут быть не так строго типизированы. Произошел сдвиг в пользу различных других альтернатив — для мобильных приложений Kotlin и Dart быстро стали фаворитами, в то время как JavaScript на Node.js быстро взял штурмом разработку веб-приложений. При этом Java по-прежнему активно используется бизнес-сообществом, поскольку она по-прежнему полностью поддерживается и активно поддерживается такими компаниями, как Oracle (к лучшему или к худшему). Даже когда пользователи предпочитают другие языки Java, сама JVM продолжает широко использоваться (для таких языков, как Scala, Closure и Kotlin).

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

В Java уже есть возможность открывать сетевые подключения через TCP к другим приложениям, но спецификация, по которой передаются данные, не была четко определена от приложения к приложению — очевидно, потому что каждое приложение отличается. Нам нужно было построить что-то, что действовало бы как золотая середина. То есть нам нужна была возможность определить спецификацию данных, которые будут передаваться между приложениями, но мы точно не хотели изобретать велосипед для каждого написанного нами приложения. Хотя существовало несколько решений, позволяющих устанавливать одноранговые соединения, ни одно из них не обеспечивало необходимой нам общей функциональности. Нашим решением этой проблемы стала BoneMesh — полносвязная сеть уровня приложения для Java. Он работает, передавая сообщения JSON (которые можно легко сериализовать и десериализовать) между узлами, позволяя разработчику указать узел вместо необходимости вручную отслеживать IP-адреса различных узлов.

Особенности интереса

Мы воспользовались природой более высоких уровней модели OSI, на которой работает BoneMesh, передавая целые объекты JSON вместо созданных вручную сообщений. Объект JSON содержит имя предполагаемой цели, область действия сообщения и сами данные, что позволяет встроенным метаданным внутри самого объекта направлять сообщение в различные модули предполагаемой цели.

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

Кроме того, BoneMesh обеспечивает взаимодействие между различными типами приложений, поскольку TCP и JSON, безусловно, не зависят от языка или платформы. Если два разных приложения написаны на Java, они оба могут использовать BoneMesh для связи, даже если их неотъемлемые функции различны. Если приложение написано на языке, отличном от Java, и может отправлять и читать из сокетов TCP, оно все равно может отправлять сообщения в приложение с поддержкой BoneMesh (хотя мы не предоставили библиотеку для этого на других языках). Конечно, спецификация передачи для конкретного приложения все еще нуждается в кодификации.

Будущие соображения

Опубликованная в настоящее время версия (версия 1.2.1) действует как полносвязная сеть, но есть много улучшений, которые необходимо разработать. Во-первых, мы хотим, чтобы BoneMesh в конечном итоге стал виртуальной ячеистой сетью, но в настоящее время требуются двухточечные соединения. Чтобы узел (один из n узлов) был полностью подключен, он должен соединяться со всеми другими (n-1) узлами. Мы считаем, что это нормально для стационарных приложений, но одноразовым приложениям или приложениям, не имеющим физического доступа к n-1 узлам, будет трудно передавать данные на узлы, которые не являются непосредственными соседями. без лишнего ретранслятора приложений, излишне обременяющего разработчика.

Во-вторых, BoneMesh поддерживает только push-уведомления от узла к узлу. Это отлично подходит для асинхронных приложений или для действий, для полного выполнения которых требуется некоторое время, но для этого требуется выделенная конечная точка по крайней мере для одного из любых двух подключенных узлов. Для приложений роуминга обходным путем является предоставление по крайней мере одной выделенной конечной точки, но это приводит к звездообразной топологии сети и может увеличить риск образования узкого места. Кроме того, узлам, находящимся за брандмауэрами, сложнее общаться с остальной частью сети (хотя WireGuard предоставляет нам обходной путь для этого).

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

Мы надеемся реализовать эти дополнения в самое ближайшее время.

Бесплатное, бесплатное программное обеспечение с открытым исходным кодом (FLOSS)

В Axonibyte мы хотим внести свой вклад в сообщество открытого исходного кода, поэтому мы выпустили BoneMesh для сообщества. Он доступен на Maven Central и на нашем веб-сайте bonemesh.axonibyte.com. Следует отметить, что это программное обеспечение все еще находится в стадии бета-тестирования — оно может пройти множество улучшений. Таким образом, мы призываем членов сообщества просматривать, вносить свой вклад, проверять и использовать библиотеку по своему усмотрению.

Для получения дополнительной информации об Axonibyte Innovations, LLC посетите наш веб-сайт www.axonibyte.com или напишите нам по адресу [email protected].