Сериализация данных с 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.