npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

net-socket-connector

v1.1.1

Published

## Предназначение

Downloads

4

Readme

client - server communication using net socket

Предназначение

Пакет предназначен для построения высоконагруженного микросервиса управления ресурсами. Связь клиент-сервер построена на модуле net socket с протоколом TCP/IP.

Описание

Микросервис построен в предположении, что идёт большой параллельный поток запросов какого либо ресурса у сервера от многих клиентов.

Сервер складывает поступившие запросы в очередь и сообщает Worker что необходимо начать обработку запросов.

Клиент может запрашивать какой-либо ресурс, например билеты в кинотеатр переговорные комнаты, прокси-сервера и т.д.

Для подобного рода запросов создаётся пул ресурсов который может как пополняться, так и освобождаться. Из этого пула ресурсов микросервис выдаёт по запросу один или несколько ресурсов.

Например, у вас есть некие заранее выделенные прокси-сервера и Вы должны выдать первый свободный прокси сервер.

Чтобы не создавать проблемы с возможной взаимной блокировкой ресурсов все запросы обрабатываются одним Worker, который координирует работу jobber.

Каждый запрос характеризуется своим типом. Например, один тип запроса - это выдать прокси сервер второй тип запроса - освободить прокси сервер. Третий запрос может бронировать переговорные комнаты.

Поскольку предполагается большой параллельный поток запросов к микросервису, то возникает вполне естественный вопрос по коммуникации между клиентом и сервером. С одной стороны для данной задачи вполне подходит стандартная коммуникация через rest api. Но она достаточно затратна по ресурсам.

Поэтому было принято решение использовать net socket. У net socket есть несколько важных преимуществ:

  • использование протокола tcp
  • возможность бинарной передачи контента (в настоящий момент я эту возможность не использую - пользуюсь стандарнтым JSON)
  • быстрая связь между клиентом и сервером

Установка

npm install --save resource-manager

Общие замечания

Для использования пакета вам нужно создать один экземпляр сервера, который будет принимать запросы от клиентов. Также необходим один экземпляр Worker. У Worker необходимо зарегистрировать необходимое количество jober (по одному для каждого типа запроса)

Сервер ведет общую очередь запросов от клиентов. При разрыве соединения с клиентом запросы, ранее полученные от клиента удаляются за исключением запросов, находящихся в работе.

Worker получает уведомления от сервера о том что имеются запросы от клиентов. Worker анализирует типы запросов и запускает необходимые джоберы.

Один джобер обрабатывает один тип запроса.

Для разных типов запросов worker может запускать параллельно несколько джоберов по одному джоберу на каждый тип запроса.

То есть Вы можете продавать билеты в кинотеатр и одновременно раздавать прокси-сервера.

Инициализация сервера

Сейчас сервер выдает отладочные сообщения с временными метками. Для активации меток необходимо использовать команду console.time('SRV1');

Инициализация сервера:

const serverTest = new ServerSocket('SRV1');
serverTest.createServer();

Инициализация Worker - координатора const w = new WorkerForServer(serverTest);

Зарегистрируйте необходимое количество jobber для каждого типа запроса

let counter = 0;
const workTestJob1: Executor<{ type: string; cnt: number }> = async (
  demand: GetNextClientJob,
): Promise<{ type: string; cnt: number }> => {
  await delay(2_000);
  return { type: 'cntResponse', cnt: counter++ };
};

const testJobWorker: JobWorker<{ type: string; cnt: number }> = {
  type: 'cntResponse',
  executor: workTestJob1,
};

w.registerNewWorker(testJobWorker);

Обратите внимаение - что jober должен возвращать объект с обязательным полем type, которое должно в точности соответствовать типу обрабабатываемого им запроса, например

{ type: 'cntResponse', cnt: counter++ };

В примере используется команда serverTest.startQueTimer(); которая выводит текущую длину очереди сообщений, хранящихся на сервере. Данная команда не обязательна.

Инициализация клиента

const s = new SocketMessagingClient('s1');
await s.connect();

Информация для соединения с сервером задается в конструкторе

PORT=41969
HOST=localhost

вместо localhost необходимо указать IP сервера на котором работает server

Для запуска диагностических сообщений необходимо дать команду console.time(CLIENT_LOG_TIME_LABEL);

Наиболее удобный способ запросить сервер и получить ответ - метод const res = await s.requestServer('cntResponse');

Послать запрос к серверу также можно с помощью метода await s.sendMsg(JSON.stringify({ type: 'getip', queryIndex: 1, payload: 0 }));

r