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