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

xyz.ping.stochastic.bootstrap

v0.4.1

Published

swim ping bootstrap function for xyz

Downloads

6

Readme

xyz.ping.stochastic.bootstrap

Build Status npm version dependencies Status


Stochastic ping bootstrap function for xyz-core.

Description

This module is an alternative for the Default Ping bootstrap and is more suitable for deployment environment.

The main difference is that the default ping will iteratively send messages to all other nodes, while this module will increase its interval when no failure occurs. As an example, a node using this ping will start with a high rate of ping messages. As the time goes by, if no failure occurs, the ping rate will decrease. If a node fails to respond, the ping rate will automatically increase again.

As an example, the following will show the logs of an arbitrary node, math.ms.js. At first, this node is working alone. Next, a new node, string.ms.js will join and leave after a while. Let's see the behavior of math.ms.js.

Note that these logs will be available with selfConf.logLevel: 'verbose'.

First, math.ms.js will only ping itself and since everything is smooth, the ping rate will decrease

verbose :: STOCH PING :: ping cycle started. current interval: 2s
verbose :: STOCH PING :: ping cycle started. current interval: 3.92s
verbose :: STOCH PING :: ping cycle started. current interval: 5.763199999999999s
verbose :: STOCH PING :: ping cycle started. current interval: 7.532672s
verbose :: STOCH PING :: ping cycle started. current interval: 9.231365119999998s
verbose :: STOCH PING :: ping cycle started. current interval: 10.862110515199998s
verbose :: STOCH PING :: ping cycle started. current interval: 12.427626094591998s
verbose :: STOCH PING :: ping cycle started. current interval: 13.930521050808318s
verbose :: STOCH PING :: ping cycle started. current interval: 15.373300208775985s
verbose :: STOCH PING :: ping cycle started. current interval: 16.758368200424947s
verbose :: STOCH PING :: ping cycle started. current interval: 18.088033472407947s
verbose :: STOCH PING :: ping cycle started. current interval: 19.36451213351163s
verbose :: STOCH PING :: ping cycle started. current interval: 20.589931648171167s
verbose :: STOCH PING :: ping cycle started. current interval: 21.766334382244317s
verbose :: STOCH PING :: ping cycle started. current interval: 22.895681006954543s
verbose :: STOCH PING :: ping cycle started. current interval: 23.979853766676364s

When we join a new node to the system and kill it, we see the following:

verbose :: STOCH PING :: ping cycle started. current interval: 26.019833231368935s
error :: STOCH PING :: Error: 127.0.0.1:5000 has been out of reach for 1 pings :: ...
verbose :: STOCH PING :: ping cycle started. current interval: 14.489519951057089s
error :: STOCH PING :: Error: 127.0.0.1:5000 has been out of reach for 2 pings :: ...
verbose :: STOCH PING :: ping cycle started. current interval: 8.954969576507404s
error :: STOCH PING :: Error: 127.0.0.1:5000 has been out of reach for 3 pings :: ...
verbose :: STOCH PING :: ping cycle started. current interval: 6.298385396723553s
error :: STOCH PING :: Error: 127.0.0.1:5000 has been out of reach for 4 pings :: ...
verbose :: STOCH PING :: ping cycle started. current interval: 5.023224990427305s
error :: STOCH PING :: Error: 127.0.0.1:5000 has been out of reach for 5 pings :: ...
verbose :: STOCH PING :: ping cycle started. current interval: 4.4111479954051065s
error :: STOCH PING :: removing node {127.0.0.1:5000} from foreignNodes and nodes list
warn :: node 127.0.0.1:5000 removed from systemConf.
info ::  SR :: System Configuration changed new values: {"nodes":["127.0.0.1:4000"]}
verbose :: STOCH PING :: ping cycle started. current interval: 4.4s
verbose :: STOCH PING :: ping cycle started. current interval: 6.224s
verbose :: STOCH PING :: ping cycle started. current interval: 7.97504s
verbose :: STOCH PING :: ping cycle started. current interval: 9.6560384s

As you see, the ping rate drops from 26 to almost 4, and when the node is removed and everything was stable again, it kept increasing again.

Please not that although this ping is more efficient than default ping, it is much slower in terms of discovering failures and propagation. Furthermore, it is still a Hearbeat based ping, meaning that each node will ping every other node in the system at a certain interval. This does not mean that this mechanism is not good, though you should be warned that it is still not efficient for very large systems.

Usage

The module can be installed by

npm install xyz.ping.stochastic.bootstrap

In order to use this ping, the defaultBootstrap must be set to false

let XYZ = require('xyz-core')
let sPing = require('xyz.ping.stochastic.bootstrap')

var ms new XYZ({
  selfConf: {
    defaultBootstrap: false
  }
})

The bootstrap function accepts the following parameters:

ms.bootstrap(sPing, {
  event: true,              
  interval: 2 * 1000,       
  maxInterval: 50 * 1000,   
  minInterval: 1 * 1000,
  port: 4000
  routePrefix: 'S_PING'
})

where the the second parameter, options can have:

| option | default value | description | |:-----------:|-----------------|-------------| | port | xyz.id().port | the port of the server to use | | event | true | cli integration | | interval | 5000 | initial interval | | maxInterval | 25000 | max interval | | minInterval | 2500 | min interval | | routePrefix | PING | route to use in both client and server | | kick | 5 | threshold to kick nodes |

Note that if routePrefix is set to its default value, since it is the same as the route of Default Ping, this one node using this ping can cooperate with another node using Default Ping.

Cli Integration

If you set event: true, a new message event will be bound to the process using this ping to fetch and monitor the rate of ping intervals. This event can be used by xyz-cli. As an example, if you clone this repo and run xyz-cli with xyztestrc.json in the root folder:

xyz dev -c ./xyztestrc.json

and use the top command:

As you see, the ping intervals of each node is shown and will be updated lively.