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