Официально выпущен ненавязчивый фреймворк для разработки Tencent Node.js Tars.js 2.0

Node.js GitHub JavaScript Тенсент

С развитием Интернета все больше и больше сервисов не только предоставляются одним узлом или одним языком, но, как правило, представляют собой многоязычную распределенную совместную разработку.Например, уровень доступа завершается Node.js, а уровень доступа уровни логики и данных разрабатываются реализацией C++/GO/Python и, таким образом, образуют крупномасштабную гетерогенную систему.

на основеTarsсистема разработанаTars.jsЧтобы пользователи могли быстро создавать и переносить службы Node.js без изменения общей архитектуры разнородных систем, а также могли легко разделить исходную единую службу на несколько логических подслужб и поддерживать сотни служб в миллиардном трафике Tencent.


Tars.js После более чем 5 лет осадок и итераций в Tencent (версия Node.js @ 0.10 обеспечивает поддержку), широко используется в десятках важных предприятий, таких как браузер Tencent QQ, настольный браузер Tencent, карта Tencent, сокровище приложений, мобильная экономка Tencent, Интернет +, медицинское обслуживание Tencent, Tencent Miying, страхование, лотерея и так далее.

Tars.js 2.0 Выпустите следующие 9 основных функций:

л 100% на Написан на JavaScript и не содержит кода C/C++.

l Балансировка нагрузки и управление несколькими процессами.

l Мониторинг исключений кода и перезапуск.

l Сбор и обработка журнала обслуживания.

l Мониторинг HTTP(s) и создание отчетов, а также поддержка настраиваемых отчетов.

l Совместимость с Tars IDL Спецификация кодека.

l Поддержка смол Вызовы RPC и функции раскраски.

l Поддерживает отправку команд управления и получение конфигураций службы.

л Оригинал Механизм отслеживания исключений LongStackTrace.

л ... доступно больше функций@tars/node-agentК пониманию

Tars.js 2.0 Три концепции дизайна:

» Высокие степени свободы:

l Совместимость со всеми (≥0.10) официальными версиями Node.js.

л да Исходный код Node.js является неинвазивным и немодифицируемым.

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

То есть:

Вы можете использовать любой фреймворк, с которым вы знакомы (например, Express.js/Koa.js и т. д., включая веб-фреймворки, но не ограничиваясь ими) без каких-либо изменений в фреймворке (без внедрения промежуточного программного обеспечения).. может пройти Запустите Tars.js и наслаждайтесь различными функциями мониторинга и управления, предоставляемыми платформой.

В то же время модули, предоставляемые Tars.js, также можно импортировать в соответствии с вашими потребностями (если они не используются, их нельзя импортировать).

» высокая производительность:

Tars.js разработан для обеспечения высокой производительности и большого параллелизма и использует множество методов оптимизации внешнего интерфейса (V8) (таких как FlattenString/FastProperties и т. д.), чтобы свести к минимуму влияние предоставляемых возможностей на производительность бизнеса.

После нашего теста (веб-сервер) влияние отчетов об обходе и мониторинга на производительность службы по умолчанию составляет ≤ 5%, а производительность общих модулей (RPC, журналы и т. д.) находится на переднем крае отрасли.

» Дифференциация:

Tars.js предоставляет дифференцированные операционные решения в зависимости от типа бизнеса:

l Службы с высоким трафиком: постарайтесь уменьшить влияние платформы на производительность службы.

л Бизнес с низким трафиком: максимально используйте аппаратные ресурсы для улучшения процесса разработки.

"Hello World"

Разверните свой код через Tars.js, вы можете напрямую получить все следующие функции:без изменения кода.


(даже официальный сайт Node.jsпример, можно запустить напрямую)

Управление процессом

Значение по умолчанию основано наclusterМодуль выполняет балансировку нагрузки, а количество процессов может быть настроено от 1 до max (количество ядер ЦП), а также может быть настроено как auto (то же количество физических ядер), чтобы уменьшить нехватку памяти и улучшить «цену-производительность».


В то же время одновременно запускается процесс обнаружения зомби для мониторинга бизнес-процессов в режиме реального времени.

» Описание случая

Сервис использует неоптимизированные регулярные выражения для фильтрации XSS-атак при преобразовании UBB-кода в HTML на форуме, однако из-за того, что пользователь публикует картинки в кодировке BASE64, время вычисления регулярных выражений слишком велико, а загрузка процессора достигает 100%:


После включения обнаружения зомби Tars.js автоматически перезапускает бизнес-процесс, когда он отслеживает, что бизнес-процесс мертв, тем самым сокращая время простоя бизнеса:


Tars.js Хотя проблема бизнес-кода (BUG) не может быть решена, мы сделаем все возможное, чтобы обеспечить доступность бизнеса.

сервисный мониторинг

Взяв имя службы и имя интерфейса (секция URL-PATH) в качестве широты, подсчитайте общий трафик, среднее потребление времени, частоту тайм-аутов и частоту исключений:


Код возврата больше 400 (настраиваемый) сообщается как исключение.

» Инструкции по мониторингу

Веб-сервисы, как правило, состоят из статических и динамических ресурсов (интерфейсов).Поскольку время запроса статических ресурсов (локальных файлов) намного меньше, чем у динамических ресурсов (бизнес-логика), объем запросов часто бывает высоким, что снижает общее обслуживание время.

На основании этого Tars.js запросит URL в Раздел PATH используется в качестве интерфейса, и каждый интерфейс может просматривать свой общий трафик, среднее потребление времени и частоту исключений, чтобы пользователи могли полностью понять производительность службы.

Мониторинг функций

Независимо от типа вашей службы, всегда сообщается о следующих функциях, чтобы упростить отслеживание проблем и оценку производительности:

l memUsage: использование памяти, которое будет отображаться как rss, heapUsed, heapTotal. Три использования (в байтах)

l cpuUsage: использование ЦП, будет сообщено об использовании ЦП, и данные будут объединены в логические отдельные ядра (единицы измерения - проценты)

l eventloopLag: (задача) задержка очереди, измеряемая каждые 2 секунды (в миллисекундах)

л libuv: использование ввода-вывода, будет сообщено Два варианта использования activeHandles и activeRequests


Каждая стратегия рассчитывается по узлам среднего (Avg), максимального значения (Max) и минимального значения (Min):


вывод журнала

Все журналы, выводимые модулем консоли (например, console.log), будут выводиться в локальный файл службы. И прикрепите соответствующую информацию (ниже), чтобы облегчить поиск проблемы.

Формат журнала: дата и время | PID процесса | уровень журнала | имя выходного файла и номер строки | содержимое журнала

2018-07-01 12:00:00|332|DEBUG|app.js:13|Server running at http://127.0.0.1:3000/

LongStackTrace

из-за Node.js использует асинхронный механизм, и при возникновении исключения стек становится неполным, что приводит к сложным проблемам с позиционированием.

В связи с этим мы предоставляем технологию трассировки длинных ссылок для автоматического подключения стека вызовов предварительного заказа при генерации исключения, а также поддерживаем фильтрацию части пользовательского кода в стеке исключений.

Поскольку эта функция приведет к снижению производительности, по умолчанию она отключена, а нечувствительные к производительности службы, такие как платформа управления, могут быть включены непосредственно в конфигурации.

» Описание случая

Выполнение приведенного выше кода вызовет следующее исключение:

ReferenceError: ThisMayThrowError is not defined

at Timeout.setTimeout as _onTimeout

at ontimeout (timers.js:427:11)

at tryOnTimeout (timers.js:289:5)

at listOnTimeout (timers.js:252:5)

at Timer.processTimers (timers.js:212:10)

Стек предварительного заказа для setTimeout потерян, что затрудняет отслеживание проблемы.

Когда эта функция включена (и пользовательский код отфильтрован), исключение, созданное приведенным выше кодом (без изменений), будет автоматически присоединено к стеку вызовов предварительного заказа (следующим образом):

ReferenceError: ThisMayThrowError is not defined

at Timeout.setTimeout [as _onTimeout] (test.js:4:13)

at Promise.resolve.then.val (test.js:2:5)

at Object.<anonymous> (test.js:1:82)

Чтобы облегчить пользователям поиск проблем, это также отражает дифференцированную концепцию работы Tars.js.



Всеми вышеперечисленными функциями можно владеть без модификации бизнес-кода (без внедрения каких-либо модулей).

Из-за ограниченного пространства не все способности могут быть показаны.Если у вас есть дополнительные требования (например, вызовы RPC и т. д.), вы можете использовать модули, предоставляемые Tars.js (ниже), чтобы достичь:

l @tars/rpc: Модуль вызова Tars RPC.

l @tars/stream: Модуль кодека протокола Tars(Tup).

l @tars/logs: Компонент журнала, включая (по размеру, времени) скользящие и удаленные журналы.

l @tars/config: Используется для получения файлов конфигурации службы онлайн.

l @tars/monitor: Обеспечьте мониторинг услуг, мониторинг функций и поддержку отчетности по мониторингу PP.

l @tars/notify: используется для передачи служебных (тревожных) сообщений.

l @tars/utils: Набор вспомогательных инструментов, включая файлы конфигурации Tars и парсер Tars RPC Endpoint.

l @tars/dyeing: Тарс Модуль определения окраски RPC.

Каждый модуль (щелкните имя, чтобы перейти) имеет чрезвычайно подробную документацию (README), к которой вы можете обратиться в любое время.

в Tars.js , вам нужно сосредоточиться только на бизнес-коде, а Tars.js сделает все остальное.

Адрес с открытым исходным кодом Github:

GitHub.com/he-know-node/t…

GitHub.com/Tencent/tar…

об авторе

@SuperZheng, основной участник проекта с открытым исходным кодом Tencent Tars, в основном ответственный за разработку базовой операционной структуры языка Node.js в среде Tars, архитектор полного стека из браузера Tencent QQ [SuperTeam], знакомый с Web (3D), терминал , back-end Вычисления с большими данными.