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