1.1.0 • Published 1 year ago

@zaycev.dev/origami v1.1.0

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

Origami

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

Возможности

  • микросервисная архитектура
  • гарантия доставки запроса
  • гарантия доставки ответа
  • мультиплатформенность
  • возможность управлять конкурентностью запросов
  • конкурентные запросы с разделением по ключу
  • отложенная доставка запроса
  • балансировка round-robin
  • предотвращение дублирования запросов

Зависимости

Для работы необходим Redis. Вся разработка велась на версии Redis 6.2.

Ответственность

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

Установка

Установка производится с помощью менеджера пакетов NPM

npm install @zaycev.dev/origami

Использование

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

import {Origami} from '@zaycev.dev/origami';



// инициализация клинта
const origami = new Origami({
    noneName: 'eu-west-01',
    appName: 'Sample service',
    
    connection: {
        host: 'redis.host',
        port: 6379,
    },
    password: 'redispassword',
});



// интерфейты параметров запроса и ответа

interface IParams {
    foo: number;
    bar: number;
};
interface IResponse {
    sum: number;
}



// инициализация сервиса
origami.channel<IParams, IResponse>('math.sum', {concurrent: 1}, async (params: IParams, requestId: string, senderId: string): Promise<IResponse> => {
    const foobar = params.foo + params.bar;
    
    return {
        sum: foobar,
    };
});



// запуск клиента
await origami.start();



// запрос к сервису
const sum = await origami.request<IResponse, IParams>('math.sum', {foo: 1234, bar: 4321});



// остановка клиента
await origami.stop();

Описание параметров

Параметры инициализации клиента

параметробязателентипописание
nodeNameнетstringИмя ноды
appNameнетstringИмя приложения
appVersionнетstringВерсия приложения
connectionдаobjectДанные для подключения к Redis
connection.hostдаstringХост Redis
connection.portдаnumberПорт Redis
passwordнетstringПароль для Redis
onConnectнетfunction()Колбек при успешном подключении
onReconnectнетfunction()Колбек при успешном переподключении
onCloseнетfunction()Колбек при разрыве соединения
onErrorнетfunction(error: Error)Колбек при ошибке
reconnectTimoutнетnumberВремя переподключения

Парамеры создания канала

origami.channel(channelName, channelOptions, channelHandler(parameters, requestId, senderId));
параметробязателентипописание
channelNameдаstringИмя канала (доступные символы a-zA-Z0-9.-_)
channelOptionsдаobjectПараметры канала
channelOptions.concurrentнетnumberКоличество одновременно исполняемых запросов в канале. 0 - без ограничений, при указании группы в параметрах запроса ограничение накладывается на группу
channelHandlerдаfunctionФункция - обработчик запроса
channelHandler.parametersдаanyПараметры запроса
channelHandler.requestIdдаstringID запроса
channelHandler.senderIdдаstringID отправителя запроса

Параметры отправки запроса

origami.request(channelName, parameters, options);
параметробязателентипописание
channelNameдаstringИмя канала (доступные символы a-zA-Z0-9.-_)
parametersдаanyПараметры запроса
optionsнетobjectОпции запроса
options.groupнетstringРазделение на группы (для конкурентного исполнения в разрезе канала/группы)
options.tryAfterнетnumberВремя исполнения запроса (отложенный запрос). Время указывается в UNIX-timestamp в секундах
options.timeoutнетnumberМаксимальное время нахождения в мемпуле (до того как запрос был достален слушателю канала). В секундах
options.noResponseнетbooleanНе ожидать ответ (после регистрации запроса отправитель сразу получит ответ и не будет ждать пока слушатель получит и обработает запрос)

Тело ответа

const response = await origami.request(...);

const {
    ok,
    code,
    result,
    executorId,
} = response;
параметробязателентипописание
okдаbooleanПризнак успешности запроса
codeдаenum(EResponseCode)При неуспешном запросе возможные значения: EResponseCode.UNEXPECTED_ERROR - необработанная ошибка в функции-обработчике. В result будет тело ошибки в формате платформы исполниения EResponseCode.TIMEOUT_ERROR - было превышено время нахождения в мемпуле. Не нашлось исполнителя или забита очередь исполнения. В result будет null
resultдаanyПри успешном запросе будет тело ответа из функции-обработчика
executorIdдаstring/nullID слушателя, который обработал запрос. При code === EResponseCode.TIMEOUT_ERROR поле будет равно null

License

Origami is available under the MIT license.

Contact

Copyright (c) 2023 Origami

Github

1.1.0

1 year ago

1.0.3

1 year ago

1.0.2

1 year ago

1.0.1

1 year ago

1.0.0

1 year ago