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