Всем привет.
Есть несколько сервисов написанных на разных языках: Java, Ruby. Межсервисное взаимодействие происходит через Kafka, HTTP и БД. В случае HTTP и БД формат передачи JSON и это иногда приводит к проблемам, потому что разные языки и их библиотеки по-разному сериализуют/десериализуют свои типы данных в/из JSON по-разному. Ruby при сериализации в JSON приводbт Decimal к строке, оборачивая значение с кавычки. А вот Java сериализует Decimal в JSON, собственно, как число, т.е. без кавычек. Пример.
Ruby: Decimal->JSON = "1.0"
Java: Decimal->JSON = 1.0
Из этого всего вытекают проблемы, когда JSON был сериализован одним ЯП, а десериализован другим.
Мне кажется, тут есть два выхода из ситуации:
1 отказаться от JSON в пользу другого текстового формата, который поддерживает типы, но я не знаю ничего кроме XML и XML точно нет;
2 обогащать JSON дополнительными meta-данными о своих типах. Я думал о JSON Schema, но и тут Минусы. Во-первых он слишком громоздкий, во-вторых типа Decimal я там так и не увидел, в инете пищут про какой-то multipleOf-тип, но мне не понравилась идея.
Прошу подсказать решение.
Спасибо.
UPD.
Про protobuff знаю, использовал. Он бы мог нас спасти, но сейчас не вариант. Дело в том, что исторически у нас куча старых джава-сервсов, поддерживаемых 5-ю джава-командами, которые ничего кроме HTTP использовать не хотят, у этих сервисов полностью синхронное взаиможействие. Также с недавних пор есть около 18-ти руби-сервисов, они полностью асинхронны, не используют HTTP, только кафка. Когда-то планировался протобаф, но пока удавалось обходиться без него. Для взаимодействия джава и руби сервисов по HTTP на стороне руби поднят-сервис прослойка, обычный веб-сервер.
В целом проблема в том, что другие команды не хотят ни protobuff, ни Kafka.