fix: fix default task function worker choice strategy and priority
[poolifier.git] / CHANGELOG.md
1 # Changelog
2
3 All notable changes to this project will be documented in this file.
4
5 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
8 ## [Unreleased]
9
10 ### Fixed
11
12 - Fix default task function worker choice strategy and priority handling.
13
14 ## [4.0.7] - 2024-05-13
15
16 ### Changed
17
18 - Add ELU statistics to pool information.
19
20 ## [4.0.6] - 2024-05-10
21
22 ### Fixed
23
24 - Fix pools' `addTaskFunction()` type definition.
25
26 ## [4.0.5] - 2024-05-09
27
28 ### Fixed
29
30 - Avoid queued tasks redistribution on the errored worker node.
31
32 ## [4.0.4] - 2024-05-08
33
34 ### Fixed
35
36 - Disable `tasksStealingOnBackPressure` by default until performance issues under heavy load are sorted out.
37
38 ## [4.0.3] - 2024-05-08
39
40 ### Changed
41
42 - Optimize task(s) stealing by dequeuing task(s) from the last prioritized bucket.
43
44 ## [4.0.2] - 2024-05-06
45
46 ### Fixed
47
48 - Ensure poolifier worker task performance measurement requirements are synchronized with task function objects' worker choice strategies.
49
50 ## [4.0.1] - 2024-05-02
51
52 ### Fixed
53
54 - Ensure dynamic worker node are initialized with sensible worker node usage default values to avoid worker choice strategies biased decisions.
55 - Account for tasks wait time in task execution time computation in worker choice strategies to avoid biased decisions under load with several prioritized task functions and tasks queue enabled.
56
57 ## [4.0.0] - 2024-04-30
58
59 ### Changed
60
61 - Support per task function(s) priority and worker choice strategy definition via a task function object: `{ taskFunction: (data?: Data) => Response | Promise<Response>, priority?: number, strategy?: WorkerChoiceStrategy }`.
62 - Add priority queue based tasks queueing. One priority queue is divided into prioritized buckets to avoid queued tasks starvation under load.
63 - BREAKING CHANGE: `listTaskFunctionNames()` to `listTaskFunctionsProperties()` in pool and worker API returning registered task functions properties.
64 - BREAKING CHANGE: `strategy` field in pool information renamed to `defaultStrategy`.
65
66 ### Fixed
67
68 - Ensure worker choice strategy options changes at runtime are propagated to poolifier workers.
69
70 ## [3.1.30] - 2024-04-22
71
72 ### Fixed
73
74 - Fix `transferList` argument type definition.
75
76 ## [3.1.29] - 2024-04-02
77
78 ### Fixed
79
80 - Fix possible race condition at worker node recreation on worker `error` and `exit` events.
81
82 ## [3.1.28] - 2024-04-01
83
84 ### Fixed
85
86 - Ensure the minimum number of workers on a started pool is guaranteed.
87
88 ## [3.1.27] - 2024-03-27
89
90 ### Fixed
91
92 - Fix publishing on JSR, take 4.
93
94 ## [3.1.26] - 2024-03-27
95
96 ### Fixed
97
98 - Fix publishing on JSR, take 3.
99
100 ## [3.1.25] - 2024-03-27
101
102 ### Fixed
103
104 - Fix publishing on JSR, take 2.
105
106 ## [3.1.24] - 2024-03-27
107
108 ### Fixed
109
110 - Fix publishing on JSR.
111
112 ## [3.1.23] - 2024-03-27
113
114 ### Changed
115
116 - Publish on JSR.
117
118 ## [3.1.22] - 2024-03-15
119
120 ### Fixed
121
122 - Fix pool event emitter registered callbacks removal at `destroy()`.
123
124 ## [3.1.21] - 2024-02-22
125
126 ### Fixed
127
128 - Fix null exception regression: [#1496](https://github.com/poolifier/poolifier/issues/1496).
129
130 ## [3.1.20] - 2024-02-11
131
132 ### Fixed
133
134 - Ensure `worker_threads` workers are unreferenced at termination.
135
136 ## [3.1.19] - 2024-01-16
137
138 ### Fixed
139
140 - Fix possible null exception at task finishing handling.
141
142 ### Changed
143
144 - Optimize Deque implementation to improve tasks queueing performance.
145
146 ## [3.1.18] - 2024-01-06
147
148 ### Fixed
149
150 - Fix dynamic pool with minimum number of workers set to zero: [#1748](https://github.com/poolifier/poolifier/issues/1748).
151
152 ## [3.1.17] - 2024-01-05
153
154 ### Changed
155
156 - Improve performance by clean up unneeded condition checks on hot code paths.
157
158 ## [3.1.16] - 2024-01-03
159
160 ### Fixed
161
162 - Add missing type to TS type definitions.
163
164 ## [3.1.15] - 2024-01-02
165
166 ### Fixed
167
168 - Fix CommonJS support with TypeScript: [#1821](https://github.com/poolifier/poolifier/issues/1821).
169
170 ## [3.1.15-0] - 2024-01-02
171
172 ### Fixed
173
174 - Fix CommonJS support with TypeScript: [#1821](https://github.com/poolifier/poolifier/issues/1821).
175
176 ## [3.1.14] - 2024-01-01
177
178 ### Fixed
179
180 - Properly handle dynamic pool with zero minimum size.
181
182 ## [3.1.13] - 2023-12-30
183
184 ### Changed
185
186 - Reduce branching in several hot code paths.
187 - Use faster object cloning implementation.
188
189 ## [3.1.12] - 2023-12-27
190
191 ### Fixed
192
193 - Fix tasks redistribution triggers at pool destroying.
194
195 ### Changed
196
197 - Switch TypeScript module resolution to Node16.
198
199 ## [3.1.12-0] - 2023-12-27
200
201 ### Fixed
202
203 - Fix tasks redistribution triggers at pool destroying.
204
205 ## [3.1.11] - 2023-12-24
206
207 ### Fixed
208
209 - Avoid worker node cross tasks stealing.
210 - Ensure only half the pool worker nodes can steal tasks.
211
212 ## [3.1.10] - 2023-12-23
213
214 ### Changed
215
216 - Avoid useless branching on pool type.
217
218 ## [3.1.9] - 2023-12-22
219
220 ### Changed
221
222 - Readd ThreadPoolOptions and ClusterPoolOptions TS type aliases to PoolOptions.
223
224 ## [3.1.8] - 2023-12-21
225
226 ### Fixed
227
228 - Fix default worker weight computation.
229 - Fix possible null exception at pool destroying.
230
231 ## [3.1.7] - 2023-12-20
232
233 ### Fixed
234
235 - Ensure worker choice strategies implementation wait for worker node readiness: [#1748](https://github.com/poolifier/poolifier/issues/1748).
236
237 ## [3.1.6] - 2023-12-18
238
239 ### Fixed
240
241 - Fix pool destroying with tasks queuing enabled.
242
243 ## [3.1.5] - 2023-12-18
244
245 ### Added
246
247 - Add queued tasks end timeout support to worker node termination.
248
249 ## [3.1.4] - 2023-12-18
250
251 ### Fixed
252
253 - Make more robust the fix for possible null exception at handling task execution response.
254
255 ## [3.1.3] - 2023-12-17
256
257 ### Fixed
258
259 - Fix possible null exception at handling task execution response.
260
261 ## [3.1.2] - 2023-12-17
262
263 ### Fixed
264
265 - Wait for queued tasks to end at worker node termination.
266
267 ## [3.1.1] - 2023-12-16
268
269 ### Fixed
270
271 - Fix pool options TS type definition.
272
273 ## [3.1.0] - 2023-12-16
274
275 ### Changed
276
277 - TypeScript breaking change: merge ThreadPoolOptions and ClusterPoolOptions types into PoolOptions type.
278
279 ## [3.0.14] - 2023-12-13
280
281 ### Fixed
282
283 - Fix possible null exception with worker_threads pools.
284
285 ## [3.0.13] - 2023-12-12
286
287 ### Fixed
288
289 - Ensure worker choice strategy wait for worker nodes readiness.
290
291 ### Changed
292
293 - Remove infinite retries support in worker choice strategy to avoid configuration leading to possible infinite recursion or loop.
294
295 ## [3.0.12] - 2023-12-12
296
297 ### Changed
298
299 - Add infinite retries support in worker choice strategy.
300
301 ## [3.0.11] - 2023-12-11
302
303 ### Fixed
304
305 - Ensure pool asynchronous resource properly track tasks execution.
306
307 ## [3.0.10] - 2023-12-08
308
309 ### Changed
310
311 - Add a fastpath when tasks stealing or redistribution is impossible.
312
313 ## [3.0.9] - 2023-11-26
314
315 ### Fixed
316
317 - Remove all pool events listener at pool destroying.
318 - Remove all worker node events listener at worker node destroying.
319 - Fix worker node event emitter listeners handling memory leak at pool options runtime change.
320
321 ## [3.0.8] - 2023-11-25
322
323 ### Fixed
324
325 - Ensure continuous tasks stealing on idle start at worker node idling.
326
327 ## [3.0.7] - 2023-11-24
328
329 ### Changed
330
331 - Make continuous tasks stealing start at worker node idling.
332
333 ## [3.0.6] - 2023-11-24
334
335 ### Fixed
336
337 - Ensure pool statuses are checked at initialization, `start()` or `destroy()`.
338 - Ensure pool `ready` event can be emitted after several `start()/destroy()` cycles.
339
340 ## [3.0.5] - 2023-10-27
341
342 ### Fixed
343
344 - Ensure pool `ready` event can be emitted only once.
345
346 ## [3.0.4] - 2023-10-20
347
348 ### Changed
349
350 - Switch to Bencher for benchmarking: [https://bencher.dev/perf/poolifier](https://bencher.dev/perf/poolifier).
351 - Use builtin retry mechanism in worker choice strategies instead of custom one.
352
353 ## [3.0.3] - 2023-10-19
354
355 ### Fixed
356
357 - Avoid null exception at sending message to worker.
358 - Avoid null exception at checking worker node readiness.
359
360 ## [3.0.2] - 2023-10-17
361
362 ### Fixed
363
364 - Fix race condition at dynamic worker node task assignment and scheduled removal. See issue [#1468](https://github.com/poolifier/poolifier/issues/1468) and [#1496](https://github.com/poolifier/poolifier/issues/1496).
365
366 ## [3.0.1] - 2023-10-16
367
368 ### Fixed
369
370 - Workaround possible race condition at work nodes array element removal and querying. See issue [#1468](https://github.com/poolifier/poolifier/issues/1468).
371
372 ### Changed
373
374 - Switch the worker node eventing code to `EventTarget` API.
375
376 ## [3.0.0] - 2023-10-08
377
378 ### Changed
379
380 - Remove Node.js 16.x.x (EOL) support.
381
382 ## [2.7.5] - 2023-10-03
383
384 ### Changed
385
386 - Use `EventEmitterAsyncResource` type from `@types/node` for pool event emitter. TypeScript users will need to update to latest `@types/node` version.
387
388 ## [2.7.4] - 2023-09-25
389
390 ### Fixed
391
392 - Fix source maps (bundler issue).
393
394 ## [2.7.3] - 2023-09-24
395
396 ### Changed
397
398 - Convert pool event emitter to event emitter async resource.
399
400 ## [2.7.2] - 2023-09-23
401
402 ### Changed
403
404 - Add source maps to npm package to ease debugging.
405
406 ### Added
407
408 - Continuous benchmarking versus other worker pools: [https://poolifier.github.io/benchmark](https://poolifier.github.io/benchmark).
409
410 ## [2.7.1] - 2023-09-20
411
412 ### Fixed
413
414 - Ensure worker message listener used one time are removed after usage.
415
416 ## [2.7.0] - 2023-09-19
417
418 ### Fixed
419
420 - Fix task stealing related tasks queue options handling at runtime.
421
422 ### Changed
423
424 - Rename `listTaskFunctions()` to `listTaskFunctionNames()` in pool and worker API.
425
426 ### Added
427
428 - Add `hasTaskFunction()`, `addTaskFunction()`, `removeTaskFunction()`, `setDefaultTaskFunction()` methods to pool API: [PR #1148](https://github.com/poolifier/poolifier/pull/1148).
429 - Stricter worker constructor arguments validation.
430
431 ## [2.6.45] - 2023-09-17
432
433 ### Changed
434
435 - Disable publication on GitHub packages registry on release until authentication issue is fixed.
436
437 ### Added
438
439 - Add `startWorkers` to pool options to whether start the minimum number of workers at pool initialization or not.
440 - Add `start()` method to pool API to start the minimum number of workers.
441 - Add `taskStealing` and `tasksStealingOnBackPressure` to tasks queue options to whether enable task stealing or not and whether enable tasks stealing under back pressure or not.
442 - Continuous internal benchmarking: [https://poolifier.github.io/benchmark-results/dev/bench](https://poolifier.github.io/benchmark-results/dev/bench).
443
444 ## [2.6.44] - 2023-09-08
445
446 ### Fixed
447
448 - Use a dedicated PAT to publish on GitHub packages registry.
449
450 ### Added
451
452 - Publish on GitHub packages registry on release.
453
454 ### Changed
455
456 - Switch from rome to biome: [PR #1128](https://github.com/poolifier/poolifier/pull/1128).
457
458 ## [2.6.43] - 2023-09-08
459
460 ### Added
461
462 - Publish on GitHub packages registry on release.
463
464 ### Changed
465
466 - Switch from rome to biome: [PR #1128](https://github.com/poolifier/poolifier/pull/1128).
467
468 ## [2.6.42] - 2023-09-06
469
470 ### Changed
471
472 - Optimize hot code paths implementation: avoid unnecessary branching, add and use optimized helpers (min, max), use reduce() array helper, ...
473
474 ## [2.6.41] - 2023-09-03
475
476 ### Changed
477
478 - Optimize worker choice strategies implementation.
479
480 ## [2.6.40] - 2023-09-01
481
482 ### Fixed
483
484 - Do not pre-choose in WRR worker choice strategy to avoid bias.
485 - Avoid array out of bound in worker choice strategies after worker node removal.
486
487 ## [2.6.39] - 2023-08-30
488
489 ### Fixed
490
491 - Fix race condition in worker choice strategies at worker node info querying while not yet initialized.
492
493 ## [2.6.38] - 2023-08-30
494
495 ### Added
496
497 - Bundle typescript types declaration into one file.
498
499 ### Changed
500
501 - Improve interleaved weighted round robin worker choice strategy implementation.
502
503 ## [2.6.37] - 2023-08-28
504
505 ### Fixed
506
507 - Ensure unused worker usage statistics are deleted at runtime.
508
509 ### Changed
510
511 - Rename worker choice strategy options `choiceRetries` to `retries`.
512 - Avoid unnecessary branching in worker choice strategies.
513
514 ## [2.6.36] - 2023-08-27
515
516 ### Fixed
517
518 - Fix pool `execute()` arguments check.
519
520 ### Changed
521
522 - Make continuous tasks stealing algorithm less aggressive.
523 - Fine tune tasks stealing algorithm under back pressure.
524
525 ## [2.6.35] - 2023-08-25
526
527 ### Fixed
528
529 - Don't account worker usage statistics for tasks that have failed.
530 - Fix pool information runtime and wait time median computation.
531
532 ### Changed
533
534 - Update simple moving average implementation to use a circular buffer.
535 - Update simple moving median implementation to use a circular buffer.
536 - Account for stolen tasks in worker usage statistics and pool information.
537
538 ### Added
539
540 - Continuous tasks stealing algorithm.
541
542 ## [2.6.34] - 2023-08-24
543
544 ### Fixes
545
546 - Avoid cascading tasks stealing under back pressure.
547
548 ### Changed
549
550 - Add fastpath to queued tasks rescheduling.
551
552 ## [2.6.33] - 2023-08-24
553
554 ### Fixed
555
556 - Fix queued tasks rescheduling.
557
558 ### Changed
559
560 - Rename tasks queue options `queueMaxSize` to `size`.
561
562 ### Added
563
564 - Task stealing scheduling algorithm if tasks queueing is enabled.
565
566 ## [2.6.32] - 2023-08-23
567
568 ### Fixed
569
570 - Ensure no task can be executed when the pool is destroyed.
571
572 ### Added
573
574 - Add `queueMaxSize` option to tasks queue options.
575 - Add O(1) deque implementation implemented with doubly linked list and use it for tasks queueing.
576 - Add tasks stealing algorithm when a worker node queue is back pressured if tasks queueing is enabled.
577
578 ## [2.6.31] - 2023-08-20
579
580 ### Fixed
581
582 - Fix worker choice strategy retries mechanism in some edge cases.
583
584 ### Changed
585
586 - Make orthogonal worker choice strategies tasks distribution and created dynamic worker usage.
587 - Remove the experimental status of the `LEAST_ELU` worker choice strategy.
588
589 ## [2.6.30] - 2023-08-19
590
591 ### Fixed
592
593 - Ensure pool event `backPressure` is emitted.
594 - Ensure pool event `full` is emitted only once.
595 - Ensure worker node cannot be instantiated without proper arguments.
596
597 ## [2.6.29] - 2023-08-18
598
599 ### Fixed
600
601 - Fix race condition between readiness and task functions worker message handling at startup.
602 - Fix duplicate task function worker usage statistics computation per task function.
603 - Update task function worker usage statistics if and only if there's at least two different task functions.
604 - Fix race condition at task function worker usage executing task computation leading to negative value.
605
606 ### Added
607
608 - Add back pressure detection on the worker node queue. Event `backPressure` is emitted when all worker node queues are full (worker node queue size >= poolMaxSize^2).
609 - Use back pressure detection in worker choice strategies.
610 - Add worker choice strategies retries mechanism if no worker is eligible.
611
612 ## [2.6.28] - 2023-08-16
613
614 ### Fixed
615
616 - Ensure pool workers are properly initialized.
617
618 ### Added
619
620 - HTTP server pool examples: express-cluster, express-hybrid.
621
622 ### Changed
623
624 - Remove now useless branching in worker hot code path.
625
626 ## [2.6.27] - 2023-08-15
627
628 ### Fixed
629
630 - Add `KillHandler` type definition to exported types.
631
632 ### Added
633
634 - Add `destroy` event to pool API.
635
636 ## [2.6.26] - 2023-08-15
637
638 ### Added
639
640 - Add kill handler to worker options allowing to execute custom code when worker is killed.
641 - Add `listTaskFunctions()` method to pool API.
642 - SMTP client pool example: nodemailer.
643
644 ## [2.6.25] - 2023-08-13
645
646 ### Added
647
648 - HTTP server pool examples: fastify-cluster, fastify-hybrid.
649 - WebSocket server pool examples: ws-cluster, ws-hybrid.
650
651 ## [2.6.24] - 2023-08-12
652
653 ### Added
654
655 - Add array of transferable objects to the `execute()` method arguments.
656 - WebSocket server pool examples: ws-worker_threads.
657
658 ## [2.6.23] - 2023-08-11
659
660 ### Fixed
661
662 - Fix pool busyness semantic when tasks queueing is enabled: the pool is busy when the number of executing tasks on each worker has reached the maximum tasks concurrency per worker.
663
664 ### Added
665
666 - HTTP client pool examples: fetch, node-fetch and axios with multiple task functions.
667 - HTTP server pool examples: express-worker_threads, fastify-worker_threads.
668
669 ## [2.6.22] - 2023-08-10
670
671 ### Fixed
672
673 - Add missing `types` field to package.json `exports`.
674
675 ### Changed
676
677 - Structure markdown documentation (PR #811).
678
679 ## [2.6.21] - 2023-08-03
680
681 ### Changed
682
683 - Improve code documentation.
684 - Code refactoring and cleanup for better maintainability and readability.
685
686 ## [2.6.20] - 2023-07-21
687
688 ### Fixed
689
690 - Fix queued tasks redistribution on error task execution starvation.
691 - Ensure tasks queueing per worker condition is untangled from the pool busyness semantic.
692
693 ### Changed
694
695 - Drastically reduce lookups by worker in the worker nodes.
696
697 ## [2.6.19] - 2023-07-20
698
699 ### Added
700
701 - Dedicated internal communication channel for worker_threads pools.
702
703 ## [2.6.18] - 2023-07-19
704
705 ### Changed
706
707 - Code refactoring and cleanup for better maintainability and readability. Bundle size is a bit smaller.
708
709 ## [2.6.17] - 2023-07-16
710
711 ### Added
712
713 - Add `listTaskFunctions()` method to worker API.
714
715 ## [2.6.16] - 2023-07-12
716
717 ### Fixed
718
719 - Fix pool startup detection.
720 - Fix worker task functions handling.
721
722 ## [2.6.15] - 2023-07-11
723
724 ### Added
725
726 - Take into account worker node readiness in worker choice strategies.
727
728 ## [2.6.14] - 2023-07-10
729
730 ### Fixed
731
732 - Fix task function statistics tracking.
733
734 ## [2.6.13] - 2023-07-10
735
736 ### Added
737
738 - Add per task function statistics tracking.
739 - Add public methods to manipulate the worker task functions at runtime.
740
741 ## [2.6.12] - 2023-07-09
742
743 ### Fixed
744
745 - Workaround import issue with `node:os` module in node 16.x.x.
746
747 ## [2.6.11] - 2023-07-09
748
749 ### Fixed
750
751 - Fix pool readiness semantic.
752
753 ## [2.6.10] - 2023-07-08
754
755 ### Fixed
756
757 - Ensure workers are not recreated on error at pool startup.
758
759 ### Added
760
761 - Add `ready` and `strategy` fields to pool information.
762 - Add pool event `ready` to notify when the number of workers created in the pool has reached the maximum size expected and are ready.
763 - Add dynamic pool sizing checks.
764
765 ## [2.6.9] - 2023-07-07
766
767 ### Fixed
768
769 - Recreate the right worker type on uncaught exception.
770
771 ### Added
772
773 - Add minimum and maximum to internal measurement statistics.
774 - Add `runTime` and `waitTime` to pool information.
775 - Check worker inactive time only on dynamic worker.
776
777 ## [2.6.8] - 2023-07-03
778
779 ### Fixed
780
781 - Brown paper bag release to fix version handling in pool information.
782
783 ## [2.6.7] - 2023-07-03
784
785 ### Fixed
786
787 - Ensure worker queued tasks at error are reassigned to other pool workers.
788
789 ### Added
790
791 - Add pool `utilization` ratio to pool information.
792 - Add `version` to pool information.
793 - Add worker information to worker nodes.
794
795 ## [2.6.6] - 2023-07-01
796
797 ### Added
798
799 - Add safe helper `availableParallelism()` to help sizing the pool.
800
801 ### Fixed
802
803 - Ensure message handler is only registered in worker.
804
805 ## [2.6.5] - 2023-06-27
806
807 ### Known issues
808
809 - Cluster pools tasks execution are not working by using ESM files extension: https://github.com/poolifier/poolifier/issues/782
810
811 ### Fixed
812
813 - Artificial version bump to 2.6.5 to workaround publication issue.
814 - Ensure cluster pool `destroy()` gracefully shutdowns worker's server.
815 - Ensure pool event is emitted before task error promise rejection.
816 - Fix queued tasks count computation.
817
818 ### Removed
819
820 - Remove unneeded worker_threads worker `MessageChannel` internal usage for IPC.
821
822 ## [2.6.4] - 2023-06-27
823
824 ### Known issues
825
826 - Cluster pools tasks execution are not working by using ESM files extension: https://github.com/poolifier/poolifier/issues/782
827
828 ### Fixed
829
830 - Ensure cluster pool `destroy()` gracefully shutdowns worker's server.
831 - Ensure pool event is emitted before task error promise rejection.
832 - Fix queued tasks count computation.
833
834 ### Removed
835
836 - Remove unneeded worker_threads worker `MessageChannel` internal usage for IPC.
837
838 ## [2.6.3] - 2023-06-19
839
840 ### Fixed
841
842 - Ensure no tasks are queued when trying to soft kill a dynamic worker.
843 - Update strategies internals after statistics computation.
844
845 ### Changed
846
847 - Optimize O(1) queue implementation.
848
849 ## [2.6.2] - 2023-06-12
850
851 ### Fixed
852
853 - Fix new worker use after creation in dynamic pool given the current worker choice strategy.
854
855 ## [2.6.1] - 2023-06-10
856
857 ### Added
858
859 - Add worker choice strategy documentation: [README.md](./docs/worker-choice-strategies.md).
860
861 ### Fixed
862
863 - Fix average statistics computation: ensure failed tasks are not accounted.
864
865 ## [2.6.0] - 2023-06-09
866
867 ### Added
868
869 - Add `LEAST_ELU` worker choice strategy (experimental).
870 - Add tasks ELU instead of runtime support to `FAIR_SHARE` worker choice strategy.
871
872 ### Changed
873
874 - Refactor pool worker node usage internals.
875 - Breaking change: refactor worker choice strategy statistics requirements: the syntax of the worker choice strategy options has changed.
876 - Breaking change: pool information `info` property object fields have been renamed.
877
878 ### Fixed
879
880 - Fix wait time accounting.
881 - Ensure worker choice strategy `LEAST_BUSY` accounts also tasks wait time.
882 - Ensure worker choice strategy `LEAST_USED` accounts also queued tasks.
883
884 ## [2.5.4] - 2023-06-07
885
886 ### Added
887
888 - Add Event Loop Utilization (ELU) statistics to worker tasks usage.
889
890 ### Changed
891
892 - Compute statistics at the worker level only if needed.
893 - Add `worker_threads` options to thread pool options.
894
895 ### Fixed
896
897 - Make the `LEAST_BUSY` strategy only relies on task runtime.
898
899 ## [2.5.3] - 2023-06-04
900
901 ### Changed
902
903 - Refine pool information content.
904 - Limit pool internals public exposure.
905
906 ## [2.5.2] - 2023-06-02
907
908 ### Added
909
910 - Add `taskError` pool event for task execution error.
911 - Add pool information `info` property to pool.
912 - Emit pool information on `busy` and `full` pool events.
913
914 ## [2.5.1] - 2023-06-01
915
916 ### Added
917
918 - Add pool option `restartWorkerOnError` to restart worker on uncaught error. Default to `true`.
919 - Add `error` pool event for uncaught worker error.
920
921 ## [2.5.0] - 2023-05-31
922
923 ### Added
924
925 - Switch pool event emitter to `EventEmitterAsyncResource`.
926 - Add tasks wait time accounting in per worker tasks usage.
927 - Add interleaved weighted round robin `INTERLEAVED_WEIGHTED_ROUND_ROBIN` worker choice strategy (experimental).
928
929 ### Changed
930
931 - Renamed worker choice strategy `LESS_BUSY` to `LEAST_BUSY` and `LESS_USED` to `LEAST_USED`.
932
933 ## [2.4.14] - 2023-05-09
934
935 ### Fixed
936
937 - Ensure no undefined task runtime can land in the tasks history.
938 - Fix median computation implementation once again.
939
940 ### Added
941
942 - Unit tests for median and queue implementations.
943
944 ## [2.4.13] - 2023-05-08
945
946 ### Fixed
947
948 - Fix worker choice strategy options validation.
949 - Fix fair share worker choice strategy internals update: ensure virtual task end timestamp is computed at task submission.
950
951 ## [2.4.12] - 2023-05-06
952
953 ### Added
954
955 - Support multiple task functions per worker.
956 - Add custom worker weights support to worker choice strategies options.
957
958 ### Changed
959
960 - Use O(1) queue implementation for tasks queueing.
961
962 ### Fixed
963
964 - Fix median computation implementation.
965 - Fix fair share worker choice strategy internals update.
966
967 ## [2.4.11] - 2023-04-23
968
969 ### Changed
970
971 - Optimize free worker finding in worker choice strategies.
972
973 ## [2.4.10] - 2023-04-15
974
975 ### Fixed
976
977 - Fix typescript type definition for task function: ensure the input data is optional.
978 - Fix typescript type definition for pool execute(): ensure the input data is optional.
979
980 ## [2.4.9] - 2023-04-15
981
982 ### Added
983
984 - Add tasks queue enablement runtime setter to pool.
985 - Add tasks queue options runtime setter to pool.
986 - Add worker choice strategy options runtime setter to pool.
987
988 ### Changed
989
990 - Remove the tasks queuing experimental status.
991
992 ### Fixed
993
994 - Fix task function type definition and validation.
995 - Fix worker choice strategy options handling.
996
997 ## [2.4.8] - 2023-04-12
998
999 ### Fixed
1000
1001 - Fix message between main worker and worker type definition for tasks.
1002 - Fix code documentation.
1003
1004 ## [2.4.7] - 2023-04-11
1005
1006 ### Added
1007
1008 - Add worker tasks queue options to pool options.
1009
1010 ### Fixed
1011
1012 - Fix missing documentation.
1013
1014 ## [2.4.6] - 2023-04-10
1015
1016 ### Fixed
1017
1018 - Ensure one task at a time is executed per worker with tasks queueing enabled.
1019 - Properly count worker executing tasks with tasks queueing enabled.
1020
1021 ## [2.4.5] - 2023-04-09
1022
1023 ### Added
1024
1025 - Use monotonic high resolution timer for worker tasks runtime.
1026 - Add worker tasks median runtime to statistics.
1027 - Add worker tasks queue (experimental).
1028
1029 ## [2.4.4] - 2023-04-07
1030
1031 ### Added
1032
1033 - Add `PoolEvents` enumeration and `PoolEvent` type.
1034
1035 ### Fixed
1036
1037 - Destroy worker only on alive check.
1038
1039 ## [2.4.3] - 2023-04-07
1040
1041 ### Fixed
1042
1043 - Fix typedoc generation with inheritance.
1044
1045 ## [2.4.2] - 2023-04-06
1046
1047 ### Added
1048
1049 - Add `full` event to dynamic pool.
1050 - Keep worker choice strategy in memory for conditional reuse.
1051
1052 ### Fixed
1053
1054 - Fix possible negative worker key at worker removal in worker choice strategies.
1055
1056 ## [2.4.1] - 2023-04-05
1057
1058 ### Changed
1059
1060 - Optimize worker choice strategy for dynamic pool.
1061
1062 ### Fixed
1063
1064 - Ensure dynamic pool does not alter worker choice strategy expected behavior.
1065
1066 ## [2.4.0] - 2023-04-04
1067
1068 ### Added
1069
1070 - Add `LESS_BUSY` worker choice strategy.
1071
1072 ### Changed
1073
1074 - Optimize worker storage in pool.
1075 - Optimize worker alive status check.
1076 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1077 - Optimize `LESS_USED` worker choice strategy.
1078 - Update benchmark versus external threads pools.
1079 - Optimize tasks usage statistics requirements for worker choice strategy.
1080
1081 ### Fixed
1082
1083 - Ensure trimmable characters are checked at pool initialization.
1084 - Fix message id integer overflow.
1085 - Fix pool worker removal in worker choice strategy internals.
1086 - Fix package publication with pnpm.
1087
1088 ## [2.4.0-3] - 2023-04-04
1089
1090 ### Added
1091
1092 - Add `LESS_BUSY` worker choice strategy.
1093
1094 ### Changed
1095
1096 - Optimize worker storage in pool.
1097 - Optimize worker alive status check.
1098 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1099 - Optimize `LESS_USED` worker choice strategy.
1100 - Update benchmark versus external threads pools.
1101
1102 ### Fixed
1103
1104 - Ensure trimmable characters are checked at pool initialization.
1105 - Fix message id integer overflow.
1106 - Fix pool worker removal in worker choice strategy internals.
1107 - Fix package publication with pnpm.
1108
1109 ## [2.4.0-2] - 2023-04-03
1110
1111 ### Added
1112
1113 - Add `LESS_BUSY` worker choice strategy.
1114
1115 ### Changed
1116
1117 - Optimize worker storage in pool.
1118 - Optimize worker alive status check.
1119 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1120 - Optimize `LESS_USED` worker choice strategy.
1121
1122 ### Fixed
1123
1124 - Ensure trimmable characters are checked at pool initialization.
1125 - Fix message id integer overflow.
1126 - Fix pool worker removal in worker choice strategy internals.
1127 - Fix package publication with pnpm.
1128
1129 ## [2.4.0-1] - 2023-04-03
1130
1131 ### Added
1132
1133 - Add `LESS_BUSY` worker choice strategy.
1134
1135 ### Changed
1136
1137 - Optimize worker storage in pool.
1138 - Optimize worker alive status check.
1139 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1140 - Optimize `LESS_USED` worker choice strategy.
1141
1142 ### Fixed
1143
1144 - Ensure trimmable characters are checked at pool initialization.
1145 - Fix message id integer overflow.
1146 - Fix pool worker removal in worker choice strategy internals.
1147
1148 ## [2.4.0-0] - 2023-04-03
1149
1150 ### Added
1151
1152 - Add `LESS_BUSY` worker choice strategy.
1153
1154 ### Changed
1155
1156 - Optimize worker storage in pool.
1157 - Optimize worker alive status check.
1158 - BREAKING CHANGE: Rename worker choice strategy `LESS_RECENTLY_USED` to `LESS_USED`.
1159 - Optimize `LESS_USED` worker choice strategy.
1160
1161 ### Fixed
1162
1163 - Ensure trimmable characters are checked at pool initialization.
1164 - Fix message id integer overflow.
1165 - Fix pool worker removal in worker choice strategy internals.
1166
1167 ## [2.3.10] - 2023-03-18
1168
1169 ### Fixed
1170
1171 - Fix package.json `exports` syntax for ESM and CommonJS.
1172
1173 ### Changed
1174
1175 - Permit SemVer pre-release publication.
1176
1177 ## [2.3.10-2] - 2023-03-18
1178
1179 ### Fixed
1180
1181 - Fix package.json `exports` syntax for ESM and CommonJS.
1182
1183 ## [2.3.10-1] - 2023-03-18
1184
1185 ### Changed
1186
1187 - Permit SemVer pre-release publication.
1188
1189 ## [2.3.10-0] - 2023-03-18
1190
1191 ### Fixed
1192
1193 - Fix package.json `exports` syntax for ESM and CommonJS.
1194
1195 ## [2.3.9] - 2023-03-18
1196
1197 ### Changed
1198
1199 - Introduce ESM module support along with CommonJS one.
1200
1201 ### Fixed
1202
1203 - Fix brown paper bag bug referencing the same object literal.
1204
1205 ## [2.3.8] - 2023-03-18
1206
1207 ### Changed
1208
1209 - Switch internal benchmarking code to benny.
1210 - Switch to TypeScript 5.x.x.
1211 - Switch rollup bundler plugins to core ones.
1212 - Switch to TSDoc syntax.
1213 - Enforce conventional commits.
1214
1215 ### Fixed
1216
1217 - Fix random integer generator.
1218 - Fix worker choice strategy pool type identification at initialization.
1219
1220 ## [2.3.7] - 2022-10-23
1221
1222 ### Changed
1223
1224 - Switch to open collective FOSS project funding platform.
1225 - Switch to ts-standard linter configuration on TypeScript code.
1226
1227 ### Fixed
1228
1229 - Fixed missing async on pool execute method.
1230 - Fixed typing in TypeScript example.
1231 - Fixed types in unit tests.
1232
1233 ## [2.3.6] - 2022-10-22
1234
1235 ### Changed
1236
1237 - Cleanup pool attributes and methods.
1238 - Refine error types thrown.
1239
1240 ### Fixed
1241
1242 - Fix continuous integration build on windows.
1243 - Fix code coverage reporting by using c8 instead of nyc.
1244
1245 ## [2.3.5] - 2022-10-21
1246
1247 ### Changed
1248
1249 - Improve benchmarks: add IO intensive task workload, add task size option, integrate code into linter.
1250 - Optimize tasks usage lookup implementation.
1251
1252 ### Fixed
1253
1254 - Fix missed pool event emitter type export.
1255 - Fix typedoc documentation generation.
1256
1257 ## [2.3.4] - 2022-10-17
1258
1259 ### Added
1260
1261 - Fully automate release process with release-it.
1262
1263 ### Changed
1264
1265 - Optimize fair share task scheduling algorithm implementation.
1266 - Update benchmark versus external pools results with latest version.
1267
1268 ## [2.3.3] - 2022-10-15
1269
1270 ### Added
1271
1272 - Add support for [cluster settings](https://nodejs.org/api/cluster.html#cluster_cluster_settings) in cluster pool options.
1273
1274 ## [2.3.2] - 2022-10-14
1275
1276 ### Changed
1277
1278 - Optimize fair share worker selection strategy implementation.
1279
1280 ### Fixed
1281
1282 - Fix WRR worker selection strategy: ensure the condition triggering the round robin can be fulfilled.
1283
1284 ## [2.3.1] - 2022-10-13
1285
1286 ### Added
1287
1288 - Pool worker choice strategies:
1289 - `WorkerChoiceStrategies.WEIGHTED_ROUND_ROBIN` strategy based on weighted round robin scheduling algorithm using tasks execution time for now.
1290 - `WorkerChoiceStrategies.FAIR_SHARE` strategy based on fair share scheduling algorithm using tasks execution time for now.
1291
1292 ## [2.2.2] - 2022-10-09
1293
1294 ### Fixed
1295
1296 - Fixed `README.md` file.
1297
1298 ## [2.2.1] - 2022-10-08
1299
1300 ### Added
1301
1302 - Dynamic worker choice strategy change at runtime.
1303
1304 ## [2.2.0] - 2022-01-05
1305
1306 ### Breaking Changes
1307
1308 - Support only Node.js version 16.x.x for cluster pool: upstream cluster API have changed on that version.
1309
1310 ## [2.1.0] - 2021-08-29
1311
1312 ### Added
1313
1314 - Add an optional pool option `messageHandler` to `PoolOptions<Worker>` for registering a message handler callback on each worker.
1315
1316 ### Breaking Changes
1317
1318 - `AbstractWorker` class `maxInactiveTime`, `killBehavior` and `async` attributes have been removed in favour of the same ones in the worker options `opts` public attribute.
1319 - `AbstractWorker` class `lastTask` attribute have been renamed to `lastTaskTimestamp`.
1320 - `AbstractWorker` class `interval` attribute have been renamed to `aliveInterval`.
1321 - `AbstractWorker` class cannot be instantiated without specifying the `mainWorker` argument referencing the main worker.
1322
1323 ## [2.0.2] - 2021-05-12
1324
1325 ### Bug fixes
1326
1327 - Fix `busy` event emission on fixed pool type
1328
1329 ## [2.0.1] - 2021-03-16
1330
1331 ### Bug fixes
1332
1333 - Check if pool options are properly set.
1334 - `busy` event is emitted on all pool types.
1335
1336 ## [2.0.0] - 2021-03-01
1337
1338 ### Bug fixes
1339
1340 - Now a thread/process by default is not deleted when the task submitted take more time than maxInactiveTime configured (issue #70).
1341
1342 ### Breaking Changes
1343
1344 - `FullPool` event is now renamed to `busy`.
1345 - `maxInactiveTime` on `ThreadWorker` default behavior is now changed, if you want to keep the old behavior set `killBehavior` to `KillBehaviors.HARD`.
1346 _Find more details on our JSDoc._
1347
1348 - `maxTasks` option on `FixedThreadPool` and `DynamicThreadPool` is now removed since is no more needed.
1349
1350 - We changed some internal structures, but you shouldn't be too affected by them as these are internal changes.
1351
1352 ### Pool options types declaration merge
1353
1354 `FixedThreadPoolOptions` and `DynamicThreadPoolOptions` type declarations have been merged to `PoolOptions<Worker>`.
1355
1356 #### New `export` strategy
1357
1358 ```js
1359 // Before
1360 const DynamicThreadPool = require('poolifier/lib/dynamic')
1361 // After
1362 const { DynamicThreadPool } = require('poolifier/lib/dynamic')
1363 ```
1364
1365 But you should always prefer just using
1366
1367 ```js
1368 const { DynamicThreadPool } = require('poolifier')
1369 ```
1370
1371 #### New type definitions for input data and response
1372
1373 For cluster worker and worker-thread pools, you can now only send and receive structured-cloneable data.
1374 _This is not a limitation by poolifier but Node.js._
1375
1376 #### Public property replacements
1377
1378 `numWorkers` property is now `numberOfWorkers`
1379
1380 #### Internal (protected) properties and methods renaming
1381
1382 These properties are not intended for end users
1383
1384 - `id` => `nextMessageId`
1385
1386 These methods are not intended for end users
1387
1388 - `_chooseWorker` => `chooseWorker`
1389 - `_newWorker` => `createWorker`
1390 - `_execute` => `internalExecute`
1391 - `_chooseWorker` => `chooseWorker`
1392 - `_checkAlive` => `checkAlive`
1393 - `_run` => `run`
1394 - `_runAsync` => `runAsync`
1395
1396 ## [1.1.0] - 2020-05-21
1397
1398 ### Added
1399
1400 - ThreadWorker support async functions as option
1401 - Various external library patches
1402
1403 ## [1.0.0] - 2020-01-24
1404
1405 ### Added
1406
1407 - FixedThreadPool implementation
1408 - DynamicThreadPool implementation
1409 - WorkerThread implementation to improve developer experience