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