Redis-backed task queue engine with advanced task control and eventual consistency

Related tags

Job Queues idoit
Overview

idoit

CI NPM version Coverage Status

Redis-backed task queue engine with advanced task control and eventual consistency.

  • Task grouping, chaining, iterators for huge ranges.
  • Postponed & scheduled task run.
  • Load distribution + worker pools.
  • Easy to embed.

Features in details

idoit provides advanced control to implement so

Grouping. Special group task execute children tasks and wait until all complete. Useful for map/reduce logic.

Chaining. Special chain task execute children one-by-one. Also useful for map-reduce or splitting very complicated tasks to more simple steps.

Mapping iterator. Special feature for huge payloads, to produce chunks on demand. Benefits:

  • No lags on mapping phase, chunks processing starts immediately.
  • Easy to optimize DB queries to build chunks of equal size (skip + limit queries are very slow on huge data).

Progress. When you use groups/chain/map scenarios, it's easy to monitor total progress via top parent. Long standalone tasks also can notify user about progress change.

Worker pools. You can split tasks by different processes. For example, if you don't wish heavy tasks to block light ones.

Sheduler. Built-in cron allows to execute tasks on given schedule.

Data consistency

  • All data in redis are evertually consistent.
  • Task can not be lost, but CAN run twice on edge cases (if process crash when task function was about to finish)
  • Progress can count "faster" if task.progressAdd() used and process crash before task complete. But that's not critical, since such info can be used only for interface progress bars updates. In most cases you will not see the difference.

Install

node.js 6+ and redis 3.0+ required.

npm install idoit --save

API

new Queue({ redisURL, concurrency = 100, name = 'default', ns = 'idoit:' })

  • redisURL (String) - redis connection url.
  • concurrency (Number) - max tasks to consume in parallel by single worker, 100 by default.
  • pool (String) - worker pool name, "default" if not set. Used if this queue instance consumes tasks only (after .start()). You can route tasks to specific pools of workers to avoid unwanted locks. You can set pool to Array, [ 'pool1', 'pool2' ] to consume tasks from several pools (for development/testing purposes).
  • ns (String) - data namespace, currently used as redis keys prefix, "idoitqueue:" by default.

It's a good practice to have separate worker pools for heavy blocking tasks and non-blocking ones. For example, nobody should block sending urgent emails. So, create several worker processes, pin those to different pools and set proper tasks concurrency. Non-blocking tasks can be cunsumed in parallel, and you can be ok with default concurrency = 100. Blocking tasks should be consumed one-by-one, set concurrency = 1 for those workers.

Note. It may happen, that you remove some task types from your app. In this case orphaned data will be wiped after 3 days.

.registerTask(options), .registerTask(name [, cron], process)

Options:

  • name (String) - the task's name.
  • baseClass (Function) - optional, base task's constructor, "Task" by default.
  • init (Function) - optional, used for async task initialization, should return Promise
    • this (Object) - current task (task total is available as this.total).
  • taskID (Function) - optional, should return new task id. Needed only for creating "exclusive" tasks, return random value by default, called as: function (taskData). Sugar: if you pass plain string, it will be wrapped to function, that always return this string.
  • process (Function) - main task function, called as: task.process(...args). Should return Promise
    • this (Object) - current task.
  • retry (Number) - optional, number of retry on error, default 2.
  • retryDelay (Number) - optional, delay in ms after retries, default 60000 ms.
  • timeout (Number) - optional, execution timeout, default 120000 ms.
  • total (Number) - optional, max progress value, default 1. If you don't modify behaviour progress starts with 0 and become 1 on task end.
  • postponeDelay (Number) - optional, if postpone is called without delay, delay is assumed to be equal to this value (in milliseconds).
  • cron (String) - optional, cron string ("15 */6 * * *"), default null.
  • track (Number) - default 3600000ms (1hr). Time to remember scheduled tasks from cron to avoid rerun if several servers in cluster have wrong clocks. Don't set too high for very frequent tasks, because it can occupy a lot of memory.

.getTask(id)

Get task by id. Returns a Promise resolved with task or with null if task not exist.

Task fields you can use:

  • total - total task progress
  • progress - current task progress
  • result - the task result
  • error - the task error

.cancel(id)

Cancel task. Returns a Promise resolved with task.

Note. You can cancel only tasks without parent.

.start()

Start worker and begin task data consume. Return Promise, resolved when queue is ready (call .ready() inside).

If pool was specified in cunstructor, only tasks routed to this pull will be consumed.

.shutdown()

Stop accepting new tasks from queue. Return Promise, resolved when all active tasks in this worker complete.

.ready()

Return Promise, resolved when queue is ready to operate (after 'connect' event, see below).

.options(opts)

Update constructor options, except redisURL.

.on('eventName', handler)

idoit is an EventEmitter instance that fires some events:

  • ready when redis connection is up and commands can be executed (tasks can be registered without connection)
  • error when an error has occured.
  • task:progress, task:progress:<task_id> - when task update progress. Event data is: { id, uid, total, progress }
  • task:end, task:end:<task_id> - when task end. Event data is: { id, uid }

.<taskName>(...params)

Create new Task with optional params.

task.options({ ... })

Override task properties. For example, you may wish to assign specific group/chain tasks to another pool.

task.run()

Run task immediately. Returns a Promise resolved with task id.

task.postpone([delay])

Postpone task execution to delay milliseconds (or to task.postponeDelay).

Returns a Promise resolved with task id.

task.restart([add_retry] [, delay])

Restart currently running task.

  • add_retry (Boolean) - optional, whether to increase retry count or not (default: false)
    • if true, retry count is increased, and task doesn't get restarted in case it's exceeded
    • if false, retry count stays the same, so a task can restart itself indefinitely
  • delay (Number) delay before restart in milliseconds (default: task.retryDelay).

Note, idoit already has built-in restart logic on task errors. Probably, you should not use this method directly. It's exposed for very specific cases.

task.progressAdd(value)

Increment current task progress.

Returns a Promise resolved with task id.

task.setDeadline(timeLeft)

Update current task deadline.

Returns a Promise resolved with task id.

Special tasks

group

Create a new task, executing children in parallel.

queue.group([
  queue.children1(),
  queue.children2(),
  queue.children3()
]).run()

Group result is unsorted array of children result.

chain

Create a new task, executing children in series. If any of children fails - chain fails too.

queue.registerTask('multiply', (a, b) => a * b);
queue.registerTask('subtract', (a, b) => a - b);

queue.chain([
  queue.multiply(2, 3), // 2 * 3 = 6
  queue.subtract(10),   // 10 - 6 = 4
  queue.multiply(3)     // 3 * 4 = 12
]).run()

Result of previous task pass as last argument of next task. Result of chain is result of last task in chain.

iterator

A special way to run huge mapping in lazy style (on demand). See comments below.

// register iterator task
queue.registerTask({
  name: 'lazy_mapper',
  baseClass: Queue.Iterator,
  // This method is called on task begin and on every child end. It can be
  // a generator function or function that return `Promise`.
  * iterate(state) {
    // ...

    // Three types of output states possible: ended, do nothing & new data.
    //
    // 1. `null` - end reached, iterator should not be called anymore.
    // 2. `{}`   - idle, there are enougth subtasks in queue, try to call
    //             iterator later (when next child finish).
    // 3. {
    //      state    - new iterator state to remember (for example, offset for
    //                 db query), any serializeable data
    //      tasks    - array of new subtasks to push into queue
    //    }
    //
    // IMPORTANT! Iterator can be called in parallel from different workers. We
    // use input `state` to resolve collisions on redis update. So, if you
    // create new subtasks:
    //
    // 1. new `state` MUST be different (for all previous states)
    // 2. `tasks` array MUST NOT be empty.
    //
    // In other case you should signal about 'end' or 'idle'.
    //
    // Invalid combination will cause 'end' + error event.
    //
    return {
      state: newState,
      tasks: chunksArray
    };
  }
});

// run iterator
queue.lazy_mapper().run();

Why this crazy magic was invented?

Imagine that you need to rebuild 10 millions of forum posts. You wish to split work by equal small chunks, but posts have no sequential integer enumeration, only mongo IDs. What can you do?

  • Direct skip + limit requests are very expensive on big collections in any database.
  • You can not split by date intervals, because posts density varies a lot from first to last post.
  • You can add an indexed field with random number to every post. Then split by intervals. That will work, but will cause random disk access - not cool.

Solution is to use iterative mapper, wich can remember "previous position". In this case, you will do range + limit requests instead of skip + limit. That works well with databases. Additional bonuses are:

  • You do not need to keep all subtasks in queue. For example, you can create 100 chunks and add next 100 when previous are about to finish.
  • Mapping phase become distributed and you can start monitoring total progress immediately.

Dev notes

Quik-run redis via docker:

# start
docker run -d -p 6379:6379 --name redis1 redis
# stop
docker stop redis1
docker rm redis1

Why one more queue?

Of cause, we are familiar with kue, celery and akka. Our target was have a balance between simplicity and power. So, we don't know if idoit works well in cluster with thousands of instances. But it should be ok in smaller volumes and it's really easy to use.

kue was not ok for our needs, because:

  • it's "priorities" concept is not flexible and does not protect well from locks by heavy tasks
  • no task grouping/chaining and so on
  • no strong guarantees of data consistency

In idoit we cared about:

  • task group/chain operations & pass data between tasks (similar to celery)
  • worker pools to isolate task execution by types.
  • easy to use & install (only redis needed, can run in existing process)
  • eventual consistency of stored data
  • essential sugar like built-in scheduler
  • iterative mapper for huge payloads (unique feature, very useful for many maintenance tasks)
  • task progress tracking
  • avoid global locks

Redis still can be a point of failure, but that's acceptable price for simplicity. Of cause you can get a better availability via distributed message buses like RMQ. But in many cases it's more important to keep things simple. With idoit you can reuse existing technologies without additional expences.

Comments
  • Update eslint to the latest version 🚀

    Update eslint to the latest version 🚀

    The devDependency eslint was updated from 5.16.0 to 6.0.0.

    This version is not covered by your current version range.

    If you don’t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Release Notes for v6.0.0
    • 81aa06b Upgrade: [email protected] (#11869) (Teddy Katz)
    • 5f022bc Fix: no-else-return autofix produces name collisions (fixes #11069) (#11867) (Milos Djermanovic)
    • ded9548 Fix: multiline-comment-style incorrect message (#11864) (golopot)
    • cad074d Docs: Add JSHint W047 compat to no-floating-decimal (#11861) (Timo Tijhof)
    • 41f6304 Upgrade: sinon (#11855) (Toru Nagashima)
    • 167ce87 Chore: remove unuseable profile command (#11854) (Toru Nagashima)
    • c844c6f Fix: max-len properly ignore trailing comments (fixes #11838) (#11841) (ZYSzys)
    • 1b5661a Fix: no-var should not fix variables named 'let' (fixes #11830) (#11832) (Milos Djermanovic)
    • 4d75956 Build: CI with Azure Pipelines (#11845) (Toru Nagashima)
    • 1db3462 Chore: rm superfluous argument & fix perf-multifiles-targets (#11834) (薛定谔的猫)
    • c57a4a4 Upgrade: @babel/polyfill => core-js v3 (#11833) (薛定谔的猫)
    • 65faa04 Docs: Clarify prefer-destructuring array/object difference (fixes #9970) (#11851) (Oliver Sieweke)
    • 81c3823 Fix: require-atomic-updates reports parameters (fixes #11723) (#11774) (Toru Nagashima)
    • aef8ea1 Sponsors: Sync README with website (ESLint Jenkins)
    Commits

    The new version differs by 134 commits.

    • a7985a6 6.0.0
    • be74dd9 Build: changelog update for 6.0.0
    • 81aa06b Upgrade: [email protected] (#11869)
    • 5f022bc Fix: no-else-return autofix produces name collisions (fixes #11069) (#11867)
    • ded9548 Fix: multiline-comment-style incorrect message (#11864)
    • cad074d Docs: Add JSHint W047 compat to no-floating-decimal (#11861)
    • 41f6304 Upgrade: sinon (#11855)
    • 167ce87 Chore: remove unuseable profile command (#11854)
    • c844c6f Fix: max-len properly ignore trailing comments (fixes #11838) (#11841)
    • 1b5661a Fix: no-var should not fix variables named 'let' (fixes #11830) (#11832)
    • 4d75956 Build: CI with Azure Pipelines (#11845)
    • 1db3462 Chore: rm superfluous argument & fix perf-multifiles-targets (#11834)
    • c57a4a4 Upgrade: @babel/polyfill => core-js v3 (#11833)
    • 65faa04 Docs: Clarify prefer-destructuring array/object difference (fixes #9970) (#11851)
    • 81c3823 Fix: require-atomic-updates reports parameters (fixes #11723) (#11774)

    There are 134 commits in total.

    See the full diff

    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 14
  • An in-range update of cron is breaking the build 🚨

    An in-range update of cron is breaking the build 🚨

    Version 1.3.1 of cron was just published.

    Branch Build failing 🚨
    Dependency cron
    Current Version 1.3.0
    Type dependency

    This version is covered by your current version range and after updating it in your project the build failed.

    cron is a direct dependency of this project, and it is very likely causing it to break. If other packages depend on yours, this update is probably also breaking those in turn.

    Status Details
    • continuous-integration/travis-ci/push: The Travis CI build failed (Details).

    Commits

    The new version differs by 40 commits.

    • 08e197e GH-339 - Update dev deps and fix tests.
    • 4a16ee0 Merge pull request #359 from jodevsa/master
    • 664b7f2 adding an extra test
    • 61d26e1 adding tests and fixing a bug
    • 98dad71 Removing hacks in sendAt that were needed when _getNextDateFrom wasn't behaving properly
    • 2e572fd Merge branch 'master' into master
    • 2fdc168 Fixing _getNextDateFrom function logic
    • 0d5135e Merge pull request #358 from shopback/master
    • 454c812 fix test file for old nodejs version
    • 4087ea0 Updated node versions for travis.
    • 877ecee fix issue when cronTime _getNextDateFrom not calculate correctly
    • cfea445 Fix utcOffset notes.
    • d2e0ab2 daily test utc.
    • 2163d1e added test to confirm running every day.
    • 89cccaa Added tool to help in constructing syntax GH-328.

    There are 40 commits in total.

    See the full diff

    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper Bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 5
  • Update redis to the latest version 🚀

    Update redis to the latest version 🚀

    The dependency redis was updated from 2.8.0 to 3.0.0.

    This version is not covered by your current version range.

    If you don’t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: salakar License: MIT

    Find out more about this release.


    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 2
  • How to remove Task ?

    How to remove Task ?

    In order to save the capacity of redis, I need to delete the task that has been successfully run, but it seems that there is no method such as task.remove or queue.remove(taskId) in the api to call, only find a setDeadline, can setDeadline (0) delete all data of task in redis ? or would you add remove method ?

    opened by henrylu 1
  • Update mocha to the latest version 🚀

    Update mocha to the latest version 🚀

    The devDependency mocha was updated from 6.2.2 to 7.0.1.

    This version is not covered by your current version range.

    If you don’t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: juergba License: MIT

    Release Notes for v7.0.1

    7.0.1 / 2020-01-25

    🐛 Fixes

    • #4165: Fix exception when skipping tests programmatically (@juergba)
    • #4153: Restore backwards compatibility for reporterOptions (@holm)
    • #4150: Fix recovery of an open test upon uncaught exception (@juergba)
    • #4147: Fix regression of leaking uncaught exception handler (@juergba)

    📖 Documentation

    🔩 Other

    Commits

    The new version differs by 61 commits ahead by 61, behind by 17.

    • d0f04e9 Release v7.0.1
    • 2277958 update CHANGELOG for v7.0.1 [ci skip]
    • 0be3f78 Fix exception when skipping tests programmatically (#4165)
    • c0f1d14 uncaughtException: fix recovery when current test is still running (#4150)
    • 9c10ada Fix backwards compability break for reporterOptions
    • a24683f Throw a descriptive error when a non-function is given to a runnable (#4133)
    • 579fd09 update copyright & trademark notices per OJSF; closes #4145
    • 0e1ccbb Fix leaking global 'uncaughtException' handler (#4147)
    • 7d78f20 Broken links in docs (#4140)
    • 69339a3 Release v7.0.0
    • 99e085f update CHANGELOG for v7.0.0 [ci skip]
    • 35cf39b Add reporter alias names to docs (#4127)
    • 3bd2d28 Forbid this.skip() within afterAll hooks (#4136)
    • 24c22be Fix hook pattern of this.skip() in beforeEach hooks (#3741)
    • 1412dc8 XUnit reporter should handle exceptions during diff generation (#4068)

    There are 61 commits in total.

    See the full diff


    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 1
  • Update serialize-error to the latest version 🚀

    Update serialize-error to the latest version 🚀

    The dependency serialize-error was updated from 4.1.0 to 5.0.0.

    This version is not covered by your current version range.

    If you don’t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: sindresorhus License: MIT

    Find out more about this release.


    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 1
  • Update eslint to the latest version 🚀

    Update eslint to the latest version 🚀

    Version 4.1.0 of eslint just got published.

    Dependency eslint
    Current Version 3.19.0
    Type devDependency

    The version 4.1.0 is not covered by your current version range.

    Without accepting this pull request your project will work just like it did before. There might be a bunch of new features, fixes and perf improvements that the maintainers worked on for you though.

    I recommend you look into these changes and try to get onto the latest version of eslint. Given that you have a decent test suite, a passing build is a strong indicator that you can take advantage of these changes by merging the proposed change into your project. Otherwise this branch is a great starting point for you to work on the update.


    Release Notes v4.1.0
    • e8f1362 Docs: Remove wrong descriptions in padded-block rule (#8783) (Plusb Preco)
    • 291a783 Update: enforceForArrowConditionals to no-extra-parens (fixes #6196) (#8439) (Evilebot Tnawi)
    • a21dd32 New: Add overrides/files options for glob-based config (fixes #3611) (#8081) (Sylvan Mably)
    • 879688c Update: Add ignoreComments option to no-trailing-spaces (#8061) (Jake Roussel)
    • b58ae2e Chore: Only instantiate fileEntryCache when cache flage set (perf) (#8763) (Gyandeep Singh)
    • 9851288 Update: fix indent errors on multiline destructure (fixes #8729) (#8756) (Victor Hom)
    • 3608f06 Docs: Increase visibility of code of conduct (fixes #8758) (#8764) (Kai Cataldo)
    • 673a58b Update: support multiple fixes in a report (fixes #7348) (#8101) (Toru Nagashima)
    • 7a1bc38 Fix: don't pass default parserOptions to custom parsers (fixes #8744) (#8745) (Teddy Katz)
    • c5b4052 Chore: enable computed-property-spacing on ESLint codebase (#8760) (Teddy Katz)
    • 3419f64 Docs: describe how to use formatters on the formatter demo page (#8754) (Teddy Katz)
    • a3ff8f2 Chore: combine tests in tests/lib/eslint.js and tests/lib/linter.js (#8746) (Teddy Katz)
    • b7cc1e6 Fix: Space-infix-ops should ignore type annotations in TypeScript (#8341) (Reyad Attiyat)
    • 46e73ee Fix: eslint --init installs wrong dependencies of popular styles (fixes #7338) (#8713) (Toru Nagashima)
    • a82361b Chore: Prevent package-lock.json files from being created (fixes #8742) (#8747) (Teddy Katz)
    • 5f81a68 New: Add eslintIgnore support to package.json (fixes #8458) (#8690) (Victor Hom)
    • b5a70b4 Update: fix multiline binary operator/parentheses indentation (#8719) (Teddy Katz)
    • ab8b016 Update: fix MemberExpression indentation with "off" option (fixes #8721) (#8724) (Teddy Katz)
    • eb5d12c Update: Add Fixer method to Linter API (#8631) (Gyandeep Singh)
    • 26a2daa Chore: Cache fs reads in ignored-paths (fixes #8363) (#8706) (Victor Hom)
    Commits

    The new version differs by 141 commits.

    • 7d9e3be 4.1.0
    • e727b7b Build: changelog update for 4.1.0
    • e8f1362 Docs: Remove wrong descriptions in padded-block rule (#8783)
    • 291a783 Update: enforceForArrowConditionals to no-extra-parens (fixes #6196) (#8439)
    • a21dd32 New: Add overrides/files options for glob-based config (fixes #3611) (#8081)
    • 879688c Update: Add ignoreComments option to no-trailing-spaces (#8061)
    • b58ae2e Chore: Only instantiate fileEntryCache when cache flage set (perf) (#8763)
    • 9851288 Update: fix indent errors on multiline destructure (fixes #8729) (#8756)
    • 3608f06 Docs: Increase visibility of code of conduct (fixes #8758) (#8764)
    • 673a58b Update: support multiple fixes in a report (fixes #7348) (#8101)
    • 7a1bc38 Fix: don't pass default parserOptions to custom parsers (fixes #8744) (#8745)
    • c5b4052 Chore: enable computed-property-spacing on ESLint codebase (#8760)
    • 3419f64 Docs: describe how to use formatters on the formatter demo page (#8754)
    • a3ff8f2 Chore: combine tests in tests/lib/eslint.js and tests/lib/linter.js (#8746)
    • b7cc1e6 Fix: Space-infix-ops should ignore type annotations in TypeScript (#8341)

    There are 141 commits in total.

    See the full diff

    Not sure how things should work exactly?

    There is a collection of frequently asked questions and of course you may always ask my humans.


    Your Greenkeeper Bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 1
  • Add Greenkeeper badge 🌴

    Add Greenkeeper badge 🌴

    Let’s get started with automated dependency management for idoit :muscle:

    All your dependencies are up-to-date right now, so this repository was enabled right away. Good job :thumbsup:

    false


    🏷 How to check the status of this repository There is a badge added to your README, indicating the status of this repository.

    This is how your badge looks like :point_right: Greenkeeper badge

    🙈 How to ignore certain dependencies

    In case you can not, or do not want to update a certain dependency right now, you can of course just change the package.json file back to your liking.

    Add a greenkeeper.ignore field to your package.json, containing a list of dependencies you don’t want to update right now.

    // package.json
    {
      …
      "greenkeeper": {
        "ignore": [
          "package-names",
          "you-want-me-to-ignore"
        ]
      }
    }
    
    👩‍💻 How to update this pull request
      # change into your repository’s directory
      git fetch
      git checkout greenkeeper/initial
      npm install-test
      # adapt your code, so it’s working again
      git commit -m 'chore: adapt code to updated dependencies'
      git push origin greenkeeper/initial
    
    ✨ How the updates will look like

    As soon as you merge this pull request I’ll create a branch for every dependency update, with the new version applied. The branch creation should trigger your testing services to check the new version. Using the results of these tests I’ll try to open meaningful and helpful pull requests and issues, so your dependencies remain working and up-to-date.

    -  "underscore": "^1.6.0"
    +  "underscore": "^1.7.0"
    

    In the above example you can see an in-range update. 1.7.0 is included in the old ^1.6.0 range, because of the caret ^ character. When the test services report success I’ll delete the branch again, because no action needs to be taken – everything is fine. When there is a failure however, I’ll create an issue so you know about the problem immediately.

    This way every single version update of your dependencies will either continue to work with your project, or you’ll get to know of potential problems immediately.

    -  "lodash": "^3.0.0"
    +  "lodash": "^4.0.0"
    

    In this example the new version 4.0.0 is not included in the old ^3.0.0 range. For version updates like these – let’s call them “out of range” updates – you’ll receive a pull request.

    Now you no longer need to check for exciting new versions by hand – I’ll just let you know automatically. And the pull request will not only serve as a reminder to update. In case it passes your decent test suite that’s a strong reason to merge right away :shipit:

    💁‍♂️ Not sure how things are going to work exactly?

    There is a collection of frequently asked questions and of course you may always ask my humans.


    Good luck with your project and see you soon :sparkles:

    Your Greenkeeper Bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 1
  • Update serialize-error to the latest version 🚀

    Update serialize-error to the latest version 🚀


    🚨 Reminder! Less than one month left to migrate your repositories over to Snyk before Greenkeeper says goodbye on June 3rd! 💜 🚚💨 💚

    Find out how to migrate to Snyk at greenkeeper.io


    The dependency serialize-error was updated from 6.0.0 to 7.0.0.

    This version is not covered by your current version range.

    If you don’t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: sindresorhus License: MIT

    Release Notes for v7.0.0

    Breaking

    • Make error properties non-enumerable (#30) cea59fc
      This is really just a bug fix, but since it can cause subtle bugs if you actually iterate over the properties, I wanted to be safe and make it a major release.

    v6.0.0...v7.0.0

    Commits

    The new version differs by 3 commits.

    See the full diff


    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 0
  • Update nyc to the latest version 🚀

    Update nyc to the latest version 🚀

    The devDependency nyc was updated from 14.1.1 to 15.0.0.

    This version is not covered by your current version range.

    If you don’t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Publisher: coreyfarrell License: ISC

    Find out more about this release.


    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 0
  • Update nyc to the latest version 🚀

    Update nyc to the latest version 🚀

    The devDependency nyc was updated from 13.3.0 to 14.0.0.

    This version is not covered by your current version range.

    If you don’t accept this pull request, your project will work just like it did before. However, you might be missing out on a bunch of new features, fixes and/or performance improvements from the dependency update.


    Find out more about this release.

    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 0
  • Pending tails

    Pending tails

    • [ ] tests coverage
    • [ ] ? check children dupes on task add
    • [ ] ? option to report dupes as errors (with good names). .run({ reportDupes: true }) ?
    • [ ] ? commands consume & tasks consume rework (minimize delays even more)
    • [ ] ? workers monitor via redis & faster locks release
    opened by puzrin 0
Owner
Nodeca
rcopen.com sources and node.js libraries
Nodeca
Kue is a priority job queue backed by redis, built for node.js.

Kue Kue is no longer maintained Please see e.g. Bull as an alternative. Thank you! Kue is a priority job queue backed by redis, built for node.js. PRO

Automattic 9.4k Dec 20, 2022
A fast, robust and extensible distributed task/job queue for Node.js, powered by Redis.

Conveyor MQ A fast, robust and extensible distributed task/job queue for Node.js, powered by Redis. Introduction Conveyor MQ is a general purpose, dis

Conveyor MQ 45 Dec 15, 2022
🪦 Redis Key Value store backed by IPFS

?? RipDB ?? A snappy, decentralized JSON store perfect for fast moving web3 builders. Redis + IPFS = RIP = ?? Install With a Package Manager (browser

Zac Denham 42 Dec 13, 2022
Redis Simple Message Queue

Redis Simple Message Queue A lightweight message queue for Node.js that requires no dedicated queue server. Just a Redis server. tl;dr: If you run a R

Patrick Liess 1.6k Dec 27, 2022
BullMQ - Premium Message Queue for NodeJS based on Redis

The fastest, most reliable, Redis-based distributed queue for Node. Carefully written for rock solid stability and atomicity. Read the documentation F

Taskforce.sh Inc. 3.1k Dec 30, 2022
A simple high-performance Redis message queue for Node.js.

RedisSMQ - Yet another simple Redis message queue A simple high-performance Redis message queue for Node.js. For more details about RedisSMQ design se

null 501 Dec 30, 2022
Yet another concurrent priority task queue, yay!

YQueue Yet another concurrent priority task queue, yay! Install npm install yqueue Features Concurrency control Prioritized tasks Error handling for b

null 6 Apr 4, 2022
Premium Queue package for handling distributed jobs and messages in NodeJS.

The fastest, most reliable, Redis-based queue for Node. Carefully written for rock solid stability and atomicity. Sponsors · Features · UIs · Install

null 13.5k Dec 31, 2022
Opinionated, type-safe, zero-dependency max/min priority queue for JavaScript and TypeScript projects.

qewe qewe is an opinionated, type-safe, zero-dependency max/min priority queue for JavaScript and TypeScript projects. Installation Add qewe to your p

Jamie McElwain 2 Jan 10, 2022
A document based messaging queue for Mongo, DocumentDB, and others

DocMQ Messaging Queue for any document-friendly architectures (DocumentDB, Mongo, Postgres + JSONB, etc). Why Choose This DocMQ is a good choice if yo

Jakob Heuser 10 Dec 7, 2022
Better Queue for NodeJS

Better Queue - Powerful flow control Super simple to use Better Queue is designed to be simple to set up but still let you do complex things. Persiste

Diamond 415 Dec 17, 2022
A client-friendly run queue

client-run-queue This package provides a RunQueue implementation for scheduling and managing async or time-consuming functions such that client-side i

Passfolio 6 Nov 22, 2022
A client-friendly run queue

client-run-queue This package provides a RunQueue implementation for scheduling and managing async or time-consuming functions such that client-side i

Passfolio 4 Jul 5, 2022
A simple Node.js APIBAN client for downloading banned IPs and inserting them into a redis set

apiban-redis A simple Node.js APIBAN client for downloading banned IPs and inserting them into a redis set. Installation This utility can be run as a

jambonz 4 Apr 5, 2022
Cache is easy to use data caching Node.js package. It supports Memcached, Redis, and In-Memory caching engines.

Cache Cache NPM implements wrapper over multiple caching engines - Memcached, Redis and In-memory (use with single threaded process in development mod

PLG Works 49 Oct 24, 2022
An open-source link shortener built with Vercel Edge Functions and Upstash Redis.

Dub An open-source link shortener built with Vercel Edge Functions and Upstash Redis. Introduction · Deploy Your Own · Contributing Introduction Dub i

Steven Tey 4.9k Jan 5, 2023
Nodejs Background jobs using redis.

node-resque: The best background jobs in node. Distributed delayed jobs in nodejs. Resque is a background job system backed by Redis (version 2.6.0 an

Actionhero 1.2k Jan 3, 2023
egg.js(jwt) + mysql(sequelize) + redis + docker + docker-compose + nginx + vue + element-ui 全栈获取省市区数据(统计局数据)【工具】项目,实现在docker环境中一键部署

Egg-spider Preview 线上预览地址 (https://ronaldoxzb.com/) admin admin Project description [后端]egg.js(jwt) + mysql(sequelize) + redis + docker + docker-compo

null 11 Sep 29, 2022
Serverless URL Shortener made with Next.js + Redis.

linki: a place for your links linki is a url shortener made with next.js and redis! built with simplicity in mind, it's all in one page. deploy your o

Jack Reiker 12 Sep 15, 2022