Сериализация данных с Avro в node js
Я хотел бы сериализовать данные из объекта JSON и отправить его через сеть с kafka в качестве конца. Теперь у меня есть схема avro в файле, которая определяет поля, необходимые для отправки в kafka для системы ведения журнала:
{"namespace": "com.company.wr.messages",
"type": "record",
"name": "Log",
"fields": [
{"name": "timestamp", "type": "long"},
{"name": "source", "type": "string"},
{"name": "version", "type": "string"},
{"name": "ipAddress", "type": "string"},
{"name": "name", "type": "string"},
{"name": "level", "type": "string"},
{"name": "errorCode", "type": "string"},
{"name": "message", "type": "string"}
]
}
Я использую Avro-схему пакетов node, я пробовал другие, но ни один из них не работает хорошо, мне просто нужно сериализоваться в режиме avro из node js.
Ответы
Ответ 1
С avsc
:
var avro = require('avsc');
// Parse the schema.
var logType = avro.parse({
"namespace": "com.company.wr.messages",
"type": "record",
"name": "Log",
"fields": [
{"name": "timestamp", "type": "long"},
{"name": "source", "type": "string"},
{"name": "version", "type": "string"},
{"name": "ipAddress", "type": "string"},
{"name": "name", "type": "string"},
{"name": "level", "type": "string"},
{"name": "errorCode", "type": "string"},
{"name": "message", "type": "string"}
]
});
// A sample log record.
var obj = {
timestamp: 2313213,
source: 'src',
version: '1.0',
ipAddress: '0.0.0.0',
name: 'foo',
level: 'INFO',
errorCode: '',
message: ''
};
// And its corresponding Avro encoding.
var buf = logType.toBuffer(obj);
Вы можете найти более подробную информацию о различных доступных способах кодирования здесь.
Ответ 2
Вот пример того, что мы делаем для аналогичного варианта использования, когда мы отправляем записи Avro в другую очередь (Amazon Kinesis), адаптированную к вашей схеме. Мы используем его с node-avro-io 0.2.0 и stream-to-arry 2.0.2.
var avro = require('node-avro-io');
var toArray = require('stream-to-array');
var schema = {
"namespace": "com.company.wr.messages",
"type": "record",
"name": "Log",
"fields": [
{"name": "timestamp", "type": "long"},
{"name": "source", "type": "string"},
{"name": "version", "type": "string"},
{"name": "ipAddress", "type": "string"},
{"name": "name", "type": "string"},
{"name": "level", "type": "string"},
{"name": "errorCode", "type": "string"},
{"name": "message", "type": "string"}
]
};
var writer = new avro.DataFile.Writer(schema, "snappy");
toArray(writer, function(err, arr) {
var dataBuffer = Buffer.concat(arr);
// Send dataBuffer to Kafka here
});
var record = {
"timestamp": 123,
"source": "example.com",
"version": "HTTP 1.1",
"ipAddress": "123.123.123.123",
"name": "Jim",
"level": "INFO",
"errorCode": "200",
"message": "foo"
};
writer.append(record).end();
Примеры для node -avro-io, на момент написания, предназначены для сериализации/десериализации файлов Avro в файловой системе. В этом примере пакет stream-to-array используется как ярлык для получения Buffer
из потока node -avro-io пакета. Buffer
можно отправить в вашу очередь в качестве сообщения в вашем продюсере Kafka.
Некоторые другие пакеты node.js, такие как avronode и Collective node -avro, являются оболочками для библиотеки С++. Я не имел столь большого успеха с этими пакетами. Здесь приведены инструкции по установке библиотеки tw: dr для node -avro Avro С++ (для нее создается пакет .deb). Это может помочь с любым пакетом оболочки С++.
sudo apt-get install -y libboost-all-dev cmake checkinstall
ssh clone [email protected]:apache/avro.git
cd avro
git checkout release-1.7.7
cd lang/c++
cmake -G "Unix Makefiles"
sudo checkinstall -y \
--install=no \
--pkgname="avro-cpp" \
--pkgrelease="1.7.7" \
--maintainer="[email protected]" \
--addso=yes
Для коллективного node -avro мне пришлось удалить строку export CXXFLAGS="-fcxx-exceptions"
из bin/install-and-run-tests
script в Ubuntu 14.04.