Repository navigation
Expand file tree
/
Copy pathconcepts.json
More file actions
1624 lines (1601 loc) · 96.8 KB
/
Copy pathconcepts.json
File metadata and controls
1624 lines (1601 loc) · 96.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
{
"meta": {
"schema_version": "1.0",
"generated_date": "2026-07-16",
"application": "SimpleL7Proxy",
"description": "Machine-readable concept taxonomy aligned with the SimpleL7Proxy source code and documentation. Not intended for human consumption.",
"source_docs_path": "docs/"
},
"domains": [
{ "id": "d01", "name": "Request Lifecycle", "description": "End-to-end path a request travels from client to backend and back." },
{ "id": "d02", "name": "Backend Management", "description": "How the proxy discovers, probes, and selects backend hosts." },
{ "id": "d03", "name": "Reliability", "description": "Mechanisms that prevent failures from propagating to clients." },
{ "id": "d04", "name": "Request Governance", "description": "Validation and priority rules applied before a request enters the queue." },
{ "id": "d05", "name": "Async Mode", "description": "Long-running request handling that decouples client wait from backend processing." },
{ "id": "d06", "name": "Observability", "description": "How the proxy exposes telemetry about its own operation." },
{ "id": "d07", "name": "Configuration Management", "description": "How settings reach the proxy and when they take effect." },
{ "id": "d08", "name": "Authentication and Security","description": "How the proxy authenticates to backends and restricts inbound callers." },
{ "id": "d09", "name": "Deployment Architecture", "description": "How the proxy is packaged and run on Azure." },
{ "id": "d10", "name": "Protocol and Headers", "description": "Named HTTP signals that cross the client-proxy and proxy-backend boundaries." }
],
"subdomains": [
{ "id": "sd01-01", "domain_id": "d01", "name": "Ingress" },
{ "id": "sd01-02", "domain_id": "d01", "name": "Priority Queue" },
{ "id": "sd01-03", "domain_id": "d01", "name": "Worker Dispatch" },
{ "id": "sd01-04", "domain_id": "d01", "name": "Response" },
{ "id": "sd02-01", "domain_id": "d02", "name": "Host Configuration" },
{ "id": "sd02-02", "domain_id": "d02", "name": "Health Polling" },
{ "id": "sd02-03", "domain_id": "d02", "name": "Backend Selection Pipeline" },
{ "id": "sd03-01", "domain_id": "d03", "name": "Circuit Breaker" },
{ "id": "sd03-02", "domain_id": "d03", "name": "Retry and Requeue" },
{ "id": "sd03-03", "domain_id": "d03", "name": "Timeout Model" },
{ "id": "sd04-01", "domain_id": "d04", "name": "Validation Pipeline" },
{ "id": "sd04-02", "domain_id": "d04", "name": "Validation Settings" },
{ "id": "sd04-03", "domain_id": "d04", "name": "User Profiles" },
{ "id": "sd04-04", "domain_id": "d04", "name": "Priority Mapping" },
{ "id": "sd06-01", "domain_id": "d06", "name": "Event Model" },
{ "id": "sd06-02", "domain_id": "d06", "name": "Telemetry Sinks" },
{ "id": "sd06-03", "domain_id": "d06", "name": "Health Endpoints" }
],
"concepts": [
{
"id": "c-listener",
"name": "Listener",
"code_file": "server.cs",
"domain_id": "d01",
"subdomain_id": "sd01-01",
"definition": "Accepts inbound HTTP connections and submits each request to the priority queue.",
"key_settings": ["Port", "Workers"],
"related_concept_ids": ["c-priority-queue", "c-enqueue", "c-validation-pipeline"],
"docs": ["contributing/architecture.md", "reference/environment-variables.md"]
},
{
"id": "c-request-data",
"name": "RequestData",
"code_file": "RequestData.cs",
"domain_id": "d01",
"subdomain_id": "sd01-01",
"definition": "Runtime object holding all data for one inbound request: headers, body, path, assigned priority, and TTL expiry.",
"key_settings": [],
"related_concept_ids": ["c-proxy-data", "c-enqueue"],
"docs": ["contributing/architecture.md"]
},
{
"id": "c-request-lifecycle-manager",
"name": "Request Lifecycle Manager",
"code_file": "RequestLifecycleManager.cs",
"domain_id": "d01",
"subdomain_id": "sd01-01",
"definition": "Coordinates request state transitions, TTL expiry, completion, failure, and cleanup across synchronous and asynchronous processing.",
"key_settings": ["DefaultTTLSecs"],
"related_concept_ids": ["c-request-data", "c-ttl", "c-async-mode"],
"docs": ["contributing/architecture.md", "reference/timeouts.md"]
},
{
"id": "c-request-types",
"name": "Request Types",
"code_file": "RequestType.cs",
"domain_id": "d01",
"subdomain_id": "sd01-01",
"definition": "Execution modes used to route responses and background work.",
"values": ["Sync", "Async", "AsyncBackground", "AsyncBackgroundCheck", "StatusCheck"],
"related_concept_ids": ["c-request-lifecycle-manager", "c-async-mode", "c-request-api"],
"docs": ["concepts/async-processing.md"]
},
{
"id": "c-enqueue",
"name": "Enqueue",
"domain_id": "d01",
"subdomain_id": "sd01-01",
"definition": "Submitting a RequestData into the priority queue. The TTL clock starts at this moment.",
"key_settings": ["MaxQueueLength"],
"related_concept_ids": ["c-ttl", "c-priority-queue", "c-max-queue-length", "c-validation-pipeline"],
"docs": ["reference/headers-and-status-codes.md", "reference/timeouts.md"]
},
{
"id": "c-max-queue-length",
"name": "Max Queue Length",
"domain_id": "d01",
"subdomain_id": "sd01-01",
"definition": "Hard cap on queued requests. Requests arriving when the queue is full receive 429 Too Many Requests.",
"key_settings": ["MaxQueueLength"],
"related_concept_ids": ["c-enqueue"],
"docs": ["reference/environment-variables.md", "reference/headers-and-status-codes.md"]
},
{
"id": "c-priority-queue",
"name": "Priority Queue",
"code_file": "PriorityQueue.cs",
"domain_id": "d01",
"subdomain_id": "sd01-02",
"definition": "Sorted list ordered by priority level integer using binary-search insertion. Lower integer exits first.",
"key_settings": ["DefaultPriority"],
"related_concept_ids": ["c-priority-level", "c-proxy-worker"],
"docs": ["contributing/architecture.md", "reference/advanced-configuration.md"]
},
{
"id": "c-priority-level",
"name": "Priority Level",
"domain_id": "d01",
"subdomain_id": "sd01-02",
"definition": "Integer assigned to every request. Lower number means higher dispatch precedence in the queue.",
"key_settings": ["PriorityValues", "DefaultPriority"],
"related_concept_ids": ["c-priority-queue", "c-priority-mapping", "c-default-priority"],
"docs": ["reference/advanced-configuration.md", "reference/environment-variables.md"]
},
{
"id": "c-default-priority",
"name": "Default Priority",
"domain_id": "d01",
"subdomain_id": "sd01-02",
"definition": "Priority level assigned when the request carries no matching PriorityKeyHeader value.",
"key_settings": ["DefaultPriority"],
"default_value": 2,
"related_concept_ids": ["c-priority-level", "c-priority-mapping"],
"docs": ["reference/advanced-configuration.md", "reference/configuration.md"]
},
{
"id": "c-ttl",
"name": "TTL (Time-to-Live)",
"domain_id": "d01",
"subdomain_id": "sd01-02",
"definition": "Wall-clock budget for the entire request lifecycle covering queue wait plus all retry attempts. Expiry returns 412.",
"key_settings": ["DefaultTTLSecs"],
"per_request_override_header": "S7PTTL",
"unit": "seconds",
"related_concept_ids": ["c-timeout", "c-enqueue"],
"docs": ["reference/timeouts.md", "reference/headers-and-status-codes.md"]
},
{
"id": "c-proxy-worker",
"name": "ProxyWorker",
"code_file": "ProxyWorker.cs",
"domain_id": "d01",
"subdomain_id": "sd01-03",
"definition": "Worker loop that dequeues a request and drives the backend selection, send, and response write cycle.",
"key_settings": ["Workers"],
"related_concept_ids": ["c-priority-queue", "c-backend-selection-pipeline"],
"docs": ["contributing/architecture.md"]
},
{
"id": "c-workers",
"name": "Workers",
"domain_id": "d01",
"subdomain_id": "sd01-03",
"definition": "Count of concurrent proxy workers. Cold setting; default 10 is for local testing only.",
"key_settings": ["Workers"],
"reload_type": "Cold",
"default_value": 10,
"related_concept_ids": ["c-proxy-worker", "c-priority-workers"],
"docs": ["reference/environment-variables.md", "reference/configuration.md"]
},
{
"id": "c-proxy-data",
"name": "ProxyData",
"code_file": "ProxyData.cs",
"domain_id": "d01",
"subdomain_id": "sd01-04",
"definition": "Runtime object holding a backend response: HTTP status code, response headers, and body.",
"key_settings": [],
"related_concept_ids": ["c-request-data", "c-pass-through"],
"docs": ["contributing/architecture.md"]
},
{
"id": "c-pass-through",
"name": "Pass-through",
"domain_id": "d01",
"subdomain_id": "sd01-04",
"definition": "Any backend status code in AcceptableStatusCodes is forwarded directly to the client without triggering retry or circuit recording.",
"key_settings": ["AcceptableStatusCodes"],
"related_concept_ids": ["c-acceptable-status-codes", "c-circuit-breaker"],
"docs": ["reference/headers-and-status-codes.md", "reference/circuit-breaker.md"]
},
{
"id": "c-response-headers-injected",
"name": "Injected Response Headers",
"domain_id": "d01",
"subdomain_id": "sd01-04",
"definition": "HTTP headers the proxy appends to every successfully proxied response before returning to the client.",
"header_names": [
"Request-Queue-Duration",
"Request-Process-Duration",
"BackendHost",
"Total-Latency",
"Attempts",
"Lifetime-Attempts"
],
"related_concept_ids": ["c-proxy-event"],
"docs": ["reference/headers-and-status-codes.md"]
},
{
"id": "c-backend-host",
"name": "Backend Host",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "A single upstream endpoint the proxy can forward requests to. Configured as Host1 through Host9.",
"key_settings": ["Host1","Host2","Host3","Host4","Host5","Host6","Host7","Host8","Host9"],
"connection_string_keys": ["host","probe","path","mode","processor","usemi","useoauth","api-key","api_key","api-key-header","audience","authprovider","ipaddress","enabled","stripprefix","strippathprefix","retryafter","useretryafter"],
"related_concept_ids": ["c-connection-string-format", "c-health-poller", "c-circuit-breaker", "c-backend-token-provider"],
"docs": ["reference/backend-hosts.md", "reference/environment-variables.md"]
},
{
"id": "c-connection-string-format",
"name": "Connection String Format",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "Preferred per-host configuration using a semicolon-delimited key=value string. Only this format supports path, mode, usemi, processor, and other modern options.",
"example": "host=https://api.example.com;probe=/health;path=/api;usemi=true",
"related_concept_ids": ["c-legacy-format", "c-composite-connection-string"],
"docs": ["reference/backend-hosts.md"]
},
{
"id": "c-legacy-format",
"name": "Legacy Format",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "Deprecated per-variable host configuration. Cannot express path, mode, usemi, or other modern per-host options. Must not be used in new deployments.",
"deprecated": true,
"deprecated_vars": ["Probe_path1","Probe_path2","Probe_path3","IP1","IP2"],
"related_concept_ids": ["c-connection-string-format"],
"docs": ["reference/backend-hosts.md", "reference/environment-variables.md"]
},
{
"id": "c-path-prefix",
"name": "Path Prefix",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "URL prefix configured on a host via the path connection string key. Requests whose URL starts with this prefix are routed to this host.",
"connection_string_key": "path",
"related_concept_ids": ["c-path-filter", "c-catch-all-host", "c-strip-prefix"],
"docs": ["reference/backend-hosts.md", "reference/load-balancing.md"]
},
{
"id": "c-catch-all-host",
"name": "Catch-all Host",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "A host with path=/ or no path configured. Receives requests that match no specific-path host.",
"connection_string_key": "path",
"related_concept_ids": ["c-path-prefix", "c-path-filter"],
"docs": ["reference/backend-hosts.md", "reference/load-balancing.md"]
},
{
"id": "c-ip-override",
"name": "IP Override",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "Forces all requests to a specific IP address, bypassing DNS resolution for that host.",
"connection_string_key": "ipaddress",
"related_concept_ids": ["c-backend-host"],
"docs": ["reference/backend-hosts.md"]
},
{
"id": "c-strip-prefix",
"name": "Strip Prefix",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "When true (default), the matched path prefix is removed from the URL before forwarding. Set stripprefix=false to preserve the full original path.",
"connection_string_key": "stripprefix",
"default_value": true,
"related_concept_ids": ["c-path-prefix"],
"docs": ["reference/backend-hosts.md"]
},
{
"id": "c-processor",
"name": "Processor",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "Named stream processor applied to the backend response after receipt. The built-in OpenAI processor extracts token usage counts from SSE streams.",
"connection_string_key": "processor",
"known_values": ["OpenAI", "AllUsage", "DefaultStream", "MultiLineAllUsage", "AllUsage-2"],
"related_concept_ids": ["c-token-telemetry", "c-direct-mode"],
"docs": ["reference/ai-foundry-integration.md", "concepts/observability.md"]
},
{
"id": "c-stream-processor-factory",
"name": "Stream Processor Factory",
"code_file": "StreamProcessorFactory.cs",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "Selects and creates response stream processors by configured name, TOKENPROCESSOR response header, and media type, with DefaultStream fallback.",
"known_values": ["OpenAI", "AllUsage", "DefaultStream", "MultiLineAllUsage", "AllUsage-2"],
"default_value": "DefaultStream",
"related_concept_ids": ["c-processor", "c-token-telemetry", "c-streaming-microservice"],
"docs": ["concepts/observability.md", "reference/ai-foundry-integration.md"]
},
{
"id": "c-direct-mode",
"name": "Direct Mode",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "Backend mode where the host is always treated as healthy. No probe is ever sent. In latency mode the host sorts first (0 ms average latency). Use for serverless or on-demand backends that must not be woken by probes.",
"connection_string_key": "mode",
"connection_string_value": "mode=direct",
"related_concept_ids": ["c-health-poller", "c-processor", "c-backend-host"],
"docs": ["reference/backend-hosts.md", "reference/ai-foundry-integration.md"]
},
{
"id": "c-indirect-mode",
"name": "Indirect Mode",
"domain_id": "d02",
"subdomain_id": "sd02-01",
"definition": "Logical backend mode where the proxy never calls or probes the host. The host must name an APIM-mode gateway through via and must belong to a named Path route.",
"connection_string_key": "mode",
"connection_string_value": "mode=indirect",
"related_concept_ids": ["c-backend-host", "c-direct-mode"],
"docs": ["reference/backend-hosts.md"]
},
{
"id": "c-health-poller",
"name": "Health Poller",
"code_file": "EndpointMonitorService.cs",
"domain_id": "d02",
"subdomain_id": "sd02-02",
"definition": "Background loop that probes each configured host at PollInterval ms intervals and tracks rolling success rate and average latency.",
"key_settings": ["PollInterval", "PollTimeout"],
"related_concept_ids": ["c-probe-path", "c-success-rate", "c-active-pool", "c-average-latency"],
"docs": ["reference/backend-hosts.md", "reference/health-endpoints.md"]
},
{
"id": "c-probe-path",
"name": "Probe Path",
"domain_id": "d02",
"subdomain_id": "sd02-02",
"definition": "URL path sent as a GET request to test backend health. Used by APIM mode and ignored by direct and indirect modes.",
"connection_string_key": "probe",
"default_value": "echo/resource?param1=sample",
"related_concept_ids": ["c-health-poller", "c-direct-mode", "c-indirect-mode"],
"docs": ["reference/backend-hosts.md"]
},
{
"id": "c-success-rate",
"name": "Success Rate",
"domain_id": "d02",
"subdomain_id": "sd02-02",
"definition": "Rolling percentage of successful probe responses for a host. Hosts below the SuccessRate threshold are removed from the active pool until they recover.",
"key_settings": ["SuccessRate"],
"default_value": 80,
"unit": "percent",
"related_concept_ids": ["c-active-pool", "c-health-poller"],
"docs": ["reference/backend-hosts.md"]
},
{
"id": "c-active-pool",
"name": "Active Pool",
"domain_id": "d02",
"subdomain_id": "sd02-02",
"definition": "Set of backend hosts currently eligible to receive traffic, filtered by rolling success rate threshold.",
"key_settings": ["SuccessRate"],
"related_concept_ids": ["c-success-rate", "c-health-poller", "c-circuit-breaker"],
"docs": ["reference/backend-hosts.md", "reference/load-balancing.md"]
},
{
"id": "c-average-latency",
"name": "Average Latency",
"domain_id": "d02",
"subdomain_id": "sd02-02",
"definition": "Rolling average probe response time per host. Used to order hosts in latency load-balance mode. Direct-mode hosts report 0 ms and sort first.",
"key_settings": [],
"related_concept_ids": ["c-health-poller", "c-latency-iterator"],
"docs": ["reference/backend-hosts.md", "reference/load-balancing.md"]
},
{
"id": "c-base-host-health",
"name": "BaseHostHealth",
"code_file": "BaseHostHealth.cs",
"domain_id": "d02",
"subdomain_id": "sd02-02",
"definition": "Runtime object holding a single host's health metrics: rolling success rate, average latency, and circuit breaker state.",
"key_settings": [],
"related_concept_ids": ["c-circuit-breaker", "c-success-rate", "c-average-latency"],
"docs": ["contributing/architecture.md"]
},
{
"id": "c-backend-selection-pipeline",
"name": "Backend Selection Pipeline",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Three-stage process run on every request: (1) path filter, (2) load-balance ordering, (3) per-host circuit-breaker gate.",
"stages": ["path-filter", "load-balance-mode", "circuit-breaker-gate"],
"related_concept_ids": ["c-path-filter", "c-load-balance-mode", "c-circuit-breaker"],
"docs": ["reference/load-balancing.md", "contributing/architecture.md"]
},
{
"id": "c-iterator-factory",
"name": "IteratorFactory",
"code_file": "IteratorFactory.cs",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Creates a load-balance iterator for a given request path based on LoadBalanceMode configuration.",
"key_settings": ["LoadBalanceMode"],
"related_concept_ids": ["c-load-balance-mode", "c-shared-iterator"],
"docs": ["contributing/architecture.md", "reference/load-balancing.md"]
},
{
"id": "c-path-filter",
"name": "Path Filter",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Stage 1 of backend selection. Specific-path hosts are checked first; if none match, catch-all hosts are used. Specific paths always win.",
"key_settings": ["path"],
"related_concept_ids": ["c-path-prefix", "c-catch-all-host", "c-backend-selection-pipeline"],
"docs": ["reference/load-balancing.md", "reference/backend-hosts.md"]
},
{
"id": "c-load-balance-mode",
"name": "Load Balance Mode",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Stage 2 of backend selection. Determines the ordering of hosts within the matched set for each request.",
"key_settings": ["LoadBalanceMode"],
"allowed_values": ["roundrobin", "latency", "timetofirstbyte", "random"],
"default_value": "latency",
"reload_type": "Warm",
"related_concept_ids": ["c-round-robin-iterator", "c-latency-iterator", "c-time-to-first-byte-iterator", "c-random-iterator"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-round-robin-iterator",
"name": "Round-Robin Iterator",
"code_file": "RoundRobinHostIterator.cs",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Distributes requests evenly across active hosts using a global atomic counter.",
"config_value": "LoadBalanceMode=roundrobin",
"related_concept_ids": ["c-load-balance-mode", "c-shared-iterator"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-latency-iterator",
"name": "Latency Iterator",
"code_file": "LatencyHostIterator.cs",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Orders hosts by ascending average probe latency per request. Direct-mode hosts always sort first at 0 ms.",
"config_value": "LoadBalanceMode=latency",
"related_concept_ids": ["c-load-balance-mode", "c-average-latency", "c-direct-mode"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-time-to-first-byte-iterator",
"name": "Time-to-First-Byte Iterator",
"code_file": "TimeToFirstByteHostIterator.cs",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Orders peers within the current priority group by ascending observed backend response-header latency.",
"config_value": "LoadBalanceMode=timetofirstbyte",
"related_concept_ids": ["c-load-balance-mode"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-random-iterator",
"name": "Random Iterator",
"code_file": "RandomHostIterator.cs",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Shuffles active hosts randomly on each request, producing no predictable access pattern.",
"config_value": "LoadBalanceMode=random",
"related_concept_ids": ["c-load-balance-mode"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-shared-iterator",
"name": "Shared Iterator",
"code_file": "SharedIteratorRegistry.cs",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Single iterator shared across all concurrent requests to the same path. Enables strict round-robin fairness across parallel workers.",
"key_settings": ["UseSharedIterators", "SharedIteratorTTLSeconds", "SharedIteratorCleanupIntervalSeconds"],
"related_concept_ids": ["c-round-robin-iterator", "c-iterator-factory"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-iteration-mode",
"name": "Iteration Mode",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Controls retry breadth. SinglePass tries each host at most once. MultiPass cycles through all hosts until MaxAttempts is reached; set MaxAttempts to 0 to disable the cap.",
"key_settings": ["IterationMode"],
"allowed_values": ["SinglePass", "MultiPass"],
"default_value": "SinglePass",
"reload_type": "Warm",
"related_concept_ids": ["c-max-attempts", "c-retry"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-max-attempts",
"name": "Max Attempts",
"domain_id": "d02",
"subdomain_id": "sd02-03",
"definition": "Maximum total host attempts in MultiPass mode. Set to 0 to disable the attempt-count limit. Hosts skipped because their circuit is OPEN do not consume an attempt.",
"key_settings": ["MaxAttempts"],
"default_value": 10,
"reload_type": "Warm",
"related_concept_ids": ["c-iteration-mode", "c-circuit-breaker"],
"docs": ["reference/load-balancing.md", "reference/configuration.md"]
},
{
"id": "c-circuit-breaker",
"name": "Circuit Breaker",
"code_file": "CircuitBreaker.cs",
"domain_id": "d03",
"subdomain_id": "sd03-01",
"definition": "Per-host failure counter with a sliding time window. Opens when the failure count in the window reaches CBErrorThreshold.",
"key_settings": ["CBErrorThreshold", "CBTimeslice", "AcceptableStatusCodes"],
"states": ["CLOSED", "OPEN"],
"reload_type": "Warm",
"related_concept_ids": ["c-circuit-closed", "c-circuit-open", "c-sliding-window", "c-auto-recovery", "c-progressive-delay", "c-global-blocked-check"],
"docs": ["reference/circuit-breaker.md"]
},
{
"id": "c-circuit-closed",
"name": "CLOSED State",
"domain_id": "d03",
"subdomain_id": "sd03-01",
"definition": "Normal circuit breaker state. Requests are forwarded to the host.",
"related_concept_ids": ["c-circuit-breaker", "c-circuit-open"],
"docs": ["reference/circuit-breaker.md"]
},
{
"id": "c-circuit-open",
"name": "OPEN State",
"domain_id": "d03",
"subdomain_id": "sd03-01",
"definition": "Circuit tripped. Host is skipped by the load-balance iterator. Skipped hosts do not consume the MaxAttempts budget.",
"related_concept_ids": ["c-circuit-breaker", "c-circuit-closed", "c-global-blocked-check"],
"docs": ["reference/circuit-breaker.md"]
},
{
"id": "c-sliding-window",
"name": "Sliding Window",
"domain_id": "d03",
"subdomain_id": "sd03-01",
"definition": "Only failures timestamped within the last CBTimeslice seconds count toward the threshold. Older entries are pruned automatically.",
"key_settings": ["CBTimeslice"],
"related_concept_ids": ["c-circuit-breaker", "c-auto-recovery"],
"docs": ["reference/circuit-breaker.md"]
},
{
"id": "c-auto-recovery",
"name": "Auto-Recovery",
"domain_id": "d03",
"subdomain_id": "sd03-01",
"definition": "Circuit closes automatically when all failures age out of the sliding window. No manual intervention required.",
"related_concept_ids": ["c-circuit-breaker", "c-sliding-window"],
"docs": ["reference/circuit-breaker.md"]
},
{
"id": "c-progressive-delay",
"name": "Progressive Delay",
"domain_id": "d03",
"subdomain_id": "sd03-01",
"definition": "Artificial per-request delay (100-500 ms) added as a host's failure count approaches CBErrorThreshold. Not configurable.",
"delay_table": [
{ "failure_pct_of_threshold": 50, "delay_ms": 100 },
{ "failure_pct_of_threshold": 60, "delay_ms": 200 },
{ "failure_pct_of_threshold": 70, "delay_ms": 300 },
{ "failure_pct_of_threshold": 80, "delay_ms": 400 },
{ "failure_pct_of_threshold": 90, "delay_ms": 500 }
],
"related_concept_ids": ["c-circuit-breaker"],
"docs": ["reference/circuit-breaker.md"]
},
{
"id": "c-global-blocked-check",
"name": "Global Blocked Check",
"code_symbol": "AreAllCircuitBreakersBlocked()",
"domain_id": "d03",
"subdomain_id": "sd03-01",
"definition": "Static circuit-breaker registry check that reports whether all registered circuit breakers are OPEN. The current request path does not call this helper directly.",
"related_concept_ids": ["c-circuit-open"],
"docs": ["reference/circuit-breaker.md"]
},
{
"id": "c-acceptable-status-codes",
"name": "Acceptable Status Codes",
"domain_id": "d03",
"subdomain_id": "sd03-01",
"definition": "HTTP status codes from backends that are not counted as circuit-breaker failures and are forwarded to the client.",
"key_settings": ["AcceptableStatusCodes"],
"default_value": [200, 202, 401, 403, 404, 408, 410, 412, 417, 400],
"reload_type": "Warm",
"related_concept_ids": ["c-circuit-breaker", "c-pass-through"],
"docs": ["reference/circuit-breaker.md", "reference/headers-and-status-codes.md"]
},
{
"id": "c-retry",
"name": "Retry",
"domain_id": "d03",
"subdomain_id": "sd03-02",
"definition": "Advancing to the next host in the iterator after a non-acceptable backend response. Does not apply when the circuit is OPEN.",
"key_settings": ["IterationMode", "MaxAttempts"],
"related_concept_ids": ["c-iteration-mode", "c-max-attempts", "c-requeue"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-requeue",
"name": "Requeue",
"domain_id": "d03",
"subdomain_id": "sd03-02",
"definition": "Returning a request to the priority queue after host attempts are exhausted and at least one backend returned 429 with S7PREQUEUE:true. Uses the shortest requeue delay seen.",
"related_concept_ids": ["c-retry", "c-s7prequeue-header", "c-retry-after"],
"docs": ["reference/load-balancing.md", "reference/headers-and-status-codes.md"]
},
{
"id": "c-s7prequeue-header",
"name": "S7PREQUEUE",
"header_direction": "backend-response",
"domain_id": "d03",
"subdomain_id": "sd03-02",
"definition": "Response header a backend sets on a 429 reply to make the request eligible for delayed requeue after the proxy finishes trying available hosts.",
"related_concept_ids": ["c-requeue", "c-retry-after"],
"docs": ["reference/headers-and-status-codes.md", "reference/load-balancing.md"]
},
{
"id": "c-retry-after",
"name": "Retry-After",
"domain_id": "d03",
"subdomain_id": "sd03-02",
"definition": "Delay from retry-after-ms (milliseconds) or Retry-After (seconds), defaulting to 1000 ms. The proxy uses the shortest eligible delay seen after host attempts are exhausted.",
"header_names": ["retry-after-ms", "Retry-After"],
"related_concept_ids": ["c-requeue", "c-s7prequeue-header"],
"docs": ["reference/load-balancing.md"]
},
{
"id": "c-timeout",
"name": "Timeout",
"domain_id": "d03",
"subdomain_id": "sd03-03",
"definition": "Per-host-attempt window in milliseconds. Resets on each retry. Effective deadline per attempt = min(remaining TTL, Timeout).",
"key_settings": ["Timeout"],
"per_request_override_header": "S7PTimeout",
"unit": "milliseconds",
"default_value": 1200000,
"reload_type": "Warm",
"related_concept_ids": ["c-ttl", "c-async-trigger-timeout"],
"docs": ["reference/timeouts.md"]
},
{
"id": "c-async-trigger-timeout",
"name": "AsyncTriggerTimeout",
"domain_id": "d03",
"subdomain_id": "sd03-03",
"definition": "Milliseconds after enqueue before the proxy releases the client with a 202 response and continues processing in the background.",
"key_settings": ["AsyncTriggerTimeout"],
"unit": "milliseconds",
"default_value": 10000,
"reload_type": "Warm",
"related_concept_ids": ["c-timeout", "c-async-mode", "c-async-timeout"],
"docs": ["reference/timeouts.md", "concepts/async-processing.md"]
},
{
"id": "c-async-timeout",
"name": "AsyncTimeout",
"domain_id": "d03",
"subdomain_id": "sd03-03",
"definition": "Maximum backend processing time in milliseconds once a request is in async mode.",
"key_settings": ["AsyncTimeout"],
"unit": "milliseconds",
"default_value": 1800000,
"reload_type": "Warm",
"related_concept_ids": ["c-async-trigger-timeout", "c-async-ttl-secs"],
"docs": ["reference/timeouts.md", "concepts/async-processing.md"]
},
{
"id": "c-async-ttl-secs",
"name": "AsyncTTLSecs",
"domain_id": "d03",
"subdomain_id": "sd03-03",
"definition": "Request TTL in seconds applied when async processing starts, replacing the synchronous request expiration.",
"key_settings": ["AsyncTTLSecs"],
"unit": "seconds",
"default_value": 86400,
"reload_type": "Warm",
"related_concept_ids": ["c-async-mode", "c-async-timeout"],
"docs": ["reference/timeouts.md", "concepts/async-processing.md", "reference/storage-blob-config.md"]
},
{
"id": "c-validation-pipeline",
"name": "Validation Pipeline",
"domain_id": "d04",
"subdomain_id": "sd04-01",
"definition": "Ordered sequence of validation checks applied to every non-probe inbound request before it is enqueued. The execution order is fixed.",
"steps": [
{ "order": 1, "concept_id": "c-inbound-key-validation", "on_failure_code": 403, "on_failure_label": "DisallowedKey", "when": "ValidateAuthConfig enables key, oauth2, or mixed mode" },
{ "order": 2, "concept_id": "c-app-id-validation", "on_failure_code": 403, "on_failure_label": "DisallowedAppID", "when": "ValidateAuthAppID=true" },
{ "order": 3, "concept_id": "c-header-stripping", "on_failure_code": null, "on_failure_label": "silent" },
{ "order": 4, "concept_id": "c-user-profile", "on_failure_code": 403, "on_failure_label": "UnknownProfile" },
{ "order": 5, "concept_id": "c-required-headers", "on_failure_code": 417, "on_failure_label": "IncompleteHeaders" },
{ "order": 6, "concept_id": "c-header-validation-rule","on_failure_code": 417, "on_failure_label": "InvalidHeader" }
],
"related_concept_ids": ["c-app-id-validation","c-inbound-key-validation","c-header-stripping","c-user-profile","c-required-headers","c-header-validation-rule"],
"docs": ["how-to/configure-security.md"]
},
{
"id": "c-app-id-validation",
"name": "App ID Validation",
"domain_id": "d04",
"subdomain_id": "sd04-01",
"definition": "Step 2 of the validation pipeline when enabled. Checks the caller's Entra Application ID against a remote allowlist before header stripping and profile/header validation checks. Designed for deployments with more than 13 App IDs (Entra's built-in limit).",
"key_settings": ["ValidateAuthAppID", "ValidateAuthAppIDUrl", "ValidateAuthAppIDHeader", "ValidateAuthAppFieldName"],
"on_failure_code": 403,
"reload_type": "Warm",
"related_concept_ids": ["c-app-id-allowlist", "c-validation-pipeline", "c-inbound-key-validation", "c-inbound-oauth-validation"],
"docs": ["how-to/configure-security.md", "reference/advanced-configuration.md"]
},
{
"id": "c-inbound-key-validation",
"name": "Inbound Key Validation",
"domain_id": "d04",
"subdomain_id": "sd04-01",
"definition": "Step 1 optional auth gate. In key or mixed mode, the proxy checks the configured inbound header against ValidateAuthKey1 or ValidateAuthKey2; bearer values in oauth2 or mixed mode use token validation.",
"key_settings": ["ValidateAuthConfig", "ValidateAuthKey1", "ValidateAuthKey2"],
"on_failure_code": 403,
"on_failure_label": "DisallowedKey",
"reload_type": "Warm",
"related_concept_ids": ["c-validation-pipeline", "c-app-id-validation", "c-inbound-oauth-validation"],
"docs": ["how-to/configure-security.md", "reference/environment-variables.md"]
},
{
"id": "c-inbound-oauth-validation",
"name": "Inbound OAuth Validation",
"code_file": "IncomingAuthValidator.cs",
"domain_id": "d08",
"definition": "Validates inbound bearer tokens in oauth2 or mixed mode using mandatory issuer, audience, lifetime, and RS256 signature validation. Signing keys are loaded and rotated through the issuer's HTTPS OIDC metadata endpoint.",
"key_settings": ["ValidateAuthConfig"],
"config_keys": ["enabled", "mode", "header", "issuer", "metadataaddress", "audience", "audiences", "claim", "requiredclaim", "validatelifetime", "validateissuer", "validateaudience", "validatesignature", "requiresignedtokens", "clockskewminutes"],
"allowed_modes": ["none", "key", "oauth", "oauth2", "mixed"],
"related_concept_ids": ["c-inbound-key-validation", "c-validation-pipeline"],
"docs": ["how-to/configure-security.md"]
},
{
"id": "c-request-preprocessor-plugins",
"name": "Request Preprocessor Plugins",
"code_file": "IRequestPreprocessorPlugin.cs",
"domain_id": "d04",
"subdomain_id": "sd04-01",
"definition": "Configured IRequestPreprocessorPlugin implementations invoked before request validation and enqueue. The allow-all implementation is used when no valid plugin is configured.",
"key_settings": ["RequestPreprocessorPlugins"],
"related_concept_ids": ["c-validation-pipeline", "c-enqueue"],
"docs": ["reference/advanced-configuration.md"]
},
{
"id": "c-header-stripping",
"name": "Header Stripping",
"domain_id": "d04",
"subdomain_id": "sd04-01",
"definition": "Step 3 of the validation pipeline. Removes headers listed in DisallowedHeaders silently. No error is returned to the caller.",
"key_settings": ["DisallowedHeaders"],
"related_concept_ids": ["c-disallowed-headers", "c-validation-pipeline"],
"docs": ["how-to/configure-security.md"]
},
{
"id": "c-required-headers",
"name": "Required Headers",
"domain_id": "d04",
"subdomain_id": "sd04-02",
"definition": "List of header names that must be non-empty on every request. The first missing header returns 417.",
"key_settings": ["RequiredHeaders"],
"on_failure_code": 417,
"on_failure_label": "IncompleteHeaders",
"reload_type": "Warm",
"related_concept_ids": ["c-validation-pipeline", "c-header-validation-rule"],
"docs": ["how-to/configure-security.md"]
},
{
"id": "c-disallowed-headers",
"name": "Disallowed Headers",
"domain_id": "d04",
"subdomain_id": "sd04-02",
"definition": "Headers stripped silently from the request before forwarding. Automatically includes the allowlist header when ValidateHeaders is configured.",
"key_settings": ["DisallowedHeaders"],
"auto_populated_by": ["c-header-validation-rule"],
"related_concept_ids": ["c-header-stripping", "c-header-validation-rule"],
"docs": ["how-to/configure-security.md"]
},
{
"id": "c-header-validation-rule",
"name": "Header Validation Rule",
"domain_id": "d04",
"subdomain_id": "sd04-02",
"definition": "ValidateHeaders mapping SourceHeader=AllowlistHeader. The source header value must appear in the comma-separated allowlist header injected from the user profile. Supports * suffix for prefix matching.",
"key_settings": ["ValidateHeaders"],
"on_failure_code": 417,
"on_failure_label": "InvalidHeader",
"reload_type": "Warm",
"side_effects": [
"auto-adds SourceHeader and AllowlistHeader to RequiredHeaders",
"auto-adds AllowlistHeader to DisallowedHeaders"
],
"related_concept_ids": ["c-user-profile", "c-required-headers", "c-disallowed-headers"],
"docs": ["how-to/configure-security.md", "reference/advanced-configuration.md"]
},
{
"id": "c-app-id-allowlist",
"name": "App ID Allowlist",
"domain_id": "d04",
"subdomain_id": "sd04-02",
"definition": "File or URL returning the list of permitted Entra Application IDs. Enforced at step 2 of the validation pipeline.",
"key_settings": ["ValidateAuthAppIDUrl", "ValidateAuthAppFieldName"],
"related_concept_ids": ["c-app-id-validation"],
"docs": ["how-to/configure-security.md", "reference/environment-variables.md"]
},
{
"id": "c-user-profile",
"name": "User Profile",
"domain_id": "d04",
"subdomain_id": "sd04-03",
"definition": "Per-user JSON object loaded periodically from a URL or file. Drives priority assignment, async configuration, and custom header injection.",
"key_settings": ["UseProfiles", "UserConfigUrl"],
"profile_fields": [
{ "field": "userId", "required": true, "description": "Unique identifier matched against the incoming request header." },
{ "field": "S7PPriorityKey", "required": false, "description": "Priority tier value mapped via PriorityKeys." },
{ "field": "async-config", "required": false, "description": "Enables async mode and sets per-user blob container and Service Bus topic." },
{ "field": "[CustomHeader]", "required": false, "description": "Any other key is injected as an HTTP request header." }
],
"related_concept_ids": ["c-user-id", "c-s7p-priority-key-field", "c-async-config-field", "c-profile-refresh", "c-suspended-user"],
"docs": ["reference/user-profiles.md"]
},
{
"id": "c-user-id",
"name": "User ID",
"domain_id": "d04",
"subdomain_id": "sd04-03",
"definition": "Unique identifier extracted from a configurable request header and used to look up the user profile record.",
"key_settings": ["UserIDFieldName"],
"default_value": "userId",
"related_concept_ids": ["c-user-profile"],
"docs": ["reference/user-profiles.md"]
},
{
"id": "c-s7p-priority-key-field",
"name": "S7PPriorityKey Profile Field",
"domain_id": "d04",
"subdomain_id": "sd04-03",
"definition": "User profile field whose value is matched against PriorityKeys to assign a priority tier to the user's requests.",
"related_concept_ids": ["c-user-profile", "c-priority-mapping"],
"docs": ["reference/user-profiles.md", "reference/advanced-configuration.md"]
},
{
"id": "c-async-config-field",
"name": "async-config Profile Field",
"domain_id": "d04",
"subdomain_id": "sd04-03",
"definition": "User profile field enabling async mode for a specific user. Specifies the user's blob container name and Service Bus topic.",
"key_settings": ["AsyncClientConfigFieldName"],
"required_subfields": ["enabled", "containername", "topic"],
"optional_subfields": ["timeout", "generatesas"],
"behavior_note": "generatesas is parsed and retained, but the current blob URI path returns base URIs and does not generate SAS tokens.",
"related_concept_ids": ["c-user-profile", "c-async-mode"],
"docs": ["reference/user-profiles.md", "concepts/async-processing.md"]
},
{
"id": "c-profile-refresh",
"name": "Profile Refresh",
"domain_id": "d04",
"subdomain_id": "sd04-03",
"definition": "Proxy reloads the user profile file at the configured interval (default 1 hour). Enables live user management without restart.",
"key_settings": ["UserConfigRefreshIntervalSecs"],
"default_value": 3600,
"unit": "seconds",
"related_concept_ids": ["c-user-profile"],
"docs": ["reference/user-profiles.md", "reference/environment-variables.md"]
},
{
"id": "c-suspended-user",
"name": "Suspended User",
"domain_id": "d04",
"subdomain_id": "sd04-03",
"definition": "User whose ID appears in the suspended users list. Returns 403 immediately, regardless of profile content.",
"key_settings": ["SuspendedUserConfigUrl"],
"on_failure_code": 403,
"related_concept_ids": ["c-user-profile"],
"docs": ["reference/user-profiles.md"]
},
{
"id": "c-priority-mapping",
"name": "Priority Mapping",
"domain_id": "d04",
"subdomain_id": "sd04-04",
"definition": "Maps a request header value to an internal priority integer and allocates dedicated worker threads to that priority level.",
"key_settings": ["PriorityKeyHeader", "PriorityKeys", "PriorityValues", "PriorityWorkers"],
"constraint": "Count of PriorityKeys MUST equal count of PriorityValues. PriorityWorkers MUST reference only levels in PriorityValues.",
"related_concept_ids": ["c-priority-key-header", "c-priority-keys", "c-priority-values", "c-priority-workers"],
"docs": ["reference/advanced-configuration.md"]
},
{
"id": "c-priority-key-header",
"name": "Priority Key Header",
"domain_id": "d04",
"subdomain_id": "sd04-04",
"definition": "Name of the request header the proxy inspects to determine priority tier. Default: S7PPriorityKey.",
"key_settings": ["PriorityKeyHeader"],
"default_value": "S7PPriorityKey",
"reload_type": "Warm",
"related_concept_ids": ["c-priority-mapping"],
"docs": ["reference/advanced-configuration.md", "reference/headers-and-status-codes.md"]
},
{
"id": "c-priority-keys",
"name": "Priority Keys",
"domain_id": "d04",
"subdomain_id": "sd04-04",
"definition": "Comma-separated list of expected header values. Each entry maps 1:1 to the corresponding entry in PriorityValues.",
"key_settings": ["PriorityKeys"],
"reload_type": "Warm",
"related_concept_ids": ["c-priority-mapping", "c-priority-values"],
"docs": ["reference/advanced-configuration.md"]
},
{
"id": "c-priority-values",
"name": "Priority Values",
"domain_id": "d04",
"subdomain_id": "sd04-04",
"definition": "Comma-separated list of internal priority integers, in 1:1 correspondence with PriorityKeys.",
"key_settings": ["PriorityValues"],
"reload_type": "Warm",
"related_concept_ids": ["c-priority-mapping", "c-priority-keys"],
"docs": ["reference/advanced-configuration.md"]
},
{
"id": "c-priority-workers",
"name": "Priority Workers",
"domain_id": "d04",
"subdomain_id": "sd04-04",
"definition": "PriorityLevel:WorkerCount pairs that reserve dedicated worker threads for each priority level.",
"key_settings": ["PriorityWorkers"],
"format": "level:count,level:count",
"reload_type": "Warm",
"related_concept_ids": ["c-priority-mapping", "c-workers"],
"docs": ["reference/advanced-configuration.md"]
},
{
"id": "c-per-user-throttling",
"name": "Per-user Throttling",
"domain_id": "d04",
"subdomain_id": "sd04-04",
"definition": "When a user's active requests exceed UserPriorityThreshold as a fraction of the total queue, that user's new requests are deprioritized.",
"key_settings": ["UserPriorityThreshold"],
"value_type": "float",
"value_range": "0.0 to 1.0",
"default_value": 0.1,
"reload_type": "Warm",
"related_concept_ids": ["c-priority-mapping", "c-user-profile"],
"docs": ["reference/advanced-configuration.md", "reference/user-profiles.md"]
},
{
"id": "c-async-mode",
"name": "Async Mode",
"domain_id": "d05",
"definition": "System-wide feature enabling asynchronous request processing. Must be enabled at three levels: proxy (AsyncModeEnabled), user profile (async-config field), and per-request (opt-in header).",
"key_settings": ["AsyncModeEnabled"],
"reload_type": "Cold",
"enablement_levels": [
"AsyncModeEnabled=true (proxy-wide switch, Cold)",
"async-config field in user profile",
"AsyncClientRequestHeader on the request"
],
"related_concept_ids": ["c-opt-in-header", "c-async-upgrade", "c-result-blob", "c-service-bus-status"],
"docs": ["concepts/async-processing.md"]
},
{
"id": "c-opt-in-header",
"name": "Opt-in Header",
"domain_id": "d05",
"definition": "Per-request header clients send to request async processing for that call. Default header name: S7PAsyncMode.",
"key_settings": ["AsyncClientRequestHeader"],