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

yato.js

v1.1.4

Published

A node module similar to hystrix. Who caused riots - cut it!

Downloads

8

Readme

yato.js

Build Status

A node module similar to hystrix. Who caused riots - cut it!

Install

npm install yato

Usage

const Yato = require('yato')
const yato = new Yato({
 // config...
})

yato
  .run(() => Promise.reslove(1))
  .then(data => data === 1) // true

API

run(command, [fallback])

run 函数接受两个参数,第一个参数是要监控的指令,第二个参数是请求失败时需要执行的回退操作。

command 是一个会返回 Promise 的回调函数,在断路器处于非打开状态时,run 函数会返回 command 执行产生的 Promise。

isOpen()

返回当前断路器是否处于打开状态

getStats()

计算并返回当前的统计数据。

{
  "state": "OPEN",
  "latencyMean": 560,
  "percentiles": {
    "25": 200,
    "50": 200,
    "75": 300,
    "90": 500,
    "95": 500,
    "99.5": 500,
    "100": 3000
  },
  "totalCount": 10,
  "errorCount": 7,
  "failures": 6,
  "timeouts": 1,
  "successes": 3,
  "shortCircuits": 0,
  "errorPercentage": 70
}

state -> 表示断路器当前的状态,可能值为: "OPEN", "HALF_OPEN", "CLOSED"

latencyMean -> 平均响应时间 = 总响应时间 / 总请求数

percentiles -> 响应时间百分比,抽取了几个关键数据,上面的例子中表示,50% 的请求延迟在 200ms 以下,75% 的请求延迟在 300ms 以下, 99.5% 的请求延迟在 500ms 以下。总共请求了 10 次的话可以得出,有 5 次请求在 200 ms 以下,有两次在 200 ~ 300ms 之间,有两次在 300ms ~ 500ms 之间,有一次超时请求用了 3000ms。

totalCount -> 总请求次数

errorCount -> 总失败次数 = failures + timeouts

failures -> 请求返回错误次数

timeouts -> 请求超时次数

successes -> 请求成功次数

shortCircuits -> 跳过请求直接返回失败或者 fallback 次数

errorPercentage -> 请求失败率 = errorCount / totalCount

Config

windowDuration

这个配置十分重要,它决定着一个 bucket 可以存在多久,以及断路器打开多久后切换为半打开状态

默认值为 10000,哦对了,这个值的单位是 ms

numBuckets

最多可以存在多少 bucket

默认值为 10

根据 windowDuration 和 numBuckets 可以计算出每隔多久应该产生一个 bucket

timeoutDuration

多久没响应算超时

默认值为 3000,单位也是 ms

errorThreshold

错误率阈值。

出错次数 = 响应出错次数 + 响应超时次数

错误率 = (出错次数 / 请求总次数) * 100

yato 会在每个请求结束或者超时后,更新断路器的状态,指标之一就是错误率,一旦错误率高于指定的阈值,断路器就会被打开。

默认值为 50

volumeThreshold

请求量阈值。

比如某段时间内,只有一个请求,且这个请求失败或者超时了,我们不希望这个时候就判定该服务 100% 不健康,因此设定了这个选项,只有总请求次数超过了这个值,我们统计的错误率才有意义。

默认值为 5

collectors

数据收集器,由使用者指定收集数据的程序。它是一个数组,这个数组是一个收集器队列,每次请求进来会触发收集器队列挨个收集请求产生的统计数据。

对单个的收集器 (collector) 来说,是一个接受统计数据的函数,通过收集器我们可以获得该请求结束后最新的统计数据。至于统计数据的结构与 getStats() API 返回的数据结构一致。

关于断路器

buckets => 每隔固定时间产生一个 bucket,每个 bucket 记录这段时间内所有请求的状态, buckets 数量有上限,达到上限后要将最早的 bucket 扔掉

bucket 的产生 => setInterval 每隔一段时间产生一个 bucket

state => OPEN / HALF_OPEN / CLOSED

默认状态是 CLOSED,也就是断路器处于关闭状态,请求能够在客户端和服务之间正常传递

每产生一个请求,将请求的情况记录到当前时间所处的 bucket 中,并根据所有的 bucket 的记录计算出服务当前的健康状况,健康状况可以根据不同服务进行配置,默认失败超过请求总量的 50%,会触发断路器打开 —— OPEN,之后的请求看到断路器处于 OPEN 状态,直接返回失败,不再向不健康的服务发送请求,以免其更加不健康。

在断路器开启 OPEN 状态时,启动计时器,根据配置,等待一段时间后,将状态变更为 HALF_OPEN,并允许请求通过,请求结束后根据请求情况更新断路器状态 —— 如果请求失败,则继续 OPEN,再次出发计时器;如果请求成功,变更状态为 CLOSED

Thanks For

https://github.com/Netflix/Hystrix

https://github.com/yammer/circuit-breaker-js

License

MIT