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