smart_message 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/deploy-github-pages.yml +38 -0
  3. data/.gitignore +5 -0
  4. data/CHANGELOG.md +30 -0
  5. data/Gemfile.lock +35 -4
  6. data/README.md +169 -71
  7. data/Rakefile +29 -4
  8. data/docs/assets/images/ddq_architecture.svg +130 -0
  9. data/docs/assets/images/dlq_architecture.svg +115 -0
  10. data/docs/assets/images/enhanced-dual-publishing.svg +136 -0
  11. data/docs/assets/images/enhanced-fluent-api.svg +149 -0
  12. data/docs/assets/images/enhanced-microservices-routing.svg +115 -0
  13. data/docs/assets/images/enhanced-pattern-matching.svg +107 -0
  14. data/docs/assets/images/fluent-api-demo.svg +59 -0
  15. data/docs/assets/images/performance-comparison.svg +161 -0
  16. data/docs/assets/images/redis-basic-architecture.svg +53 -0
  17. data/docs/assets/images/redis-enhanced-architecture.svg +88 -0
  18. data/docs/assets/images/redis-queue-architecture.svg +101 -0
  19. data/docs/assets/images/smart_message.jpg +0 -0
  20. data/docs/assets/images/smart_message_walking.jpg +0 -0
  21. data/docs/assets/images/smartmessage_architecture_overview.svg +173 -0
  22. data/docs/assets/images/transport-comparison-matrix.svg +171 -0
  23. data/docs/assets/javascripts/mathjax.js +17 -0
  24. data/docs/assets/stylesheets/extra.css +51 -0
  25. data/docs/{addressing.md → core-concepts/addressing.md} +5 -7
  26. data/docs/{architecture.md → core-concepts/architecture.md} +78 -138
  27. data/docs/{dispatcher.md → core-concepts/dispatcher.md} +21 -21
  28. data/docs/{message_filtering.md → core-concepts/message-filtering.md} +2 -3
  29. data/docs/{message_processing.md → core-concepts/message-processing.md} +17 -17
  30. data/docs/{troubleshooting.md → development/troubleshooting.md} +7 -7
  31. data/docs/{examples.md → getting-started/examples.md} +115 -89
  32. data/docs/{getting-started.md → getting-started/quick-start.md} +47 -18
  33. data/docs/guides/redis-queue-getting-started.md +697 -0
  34. data/docs/guides/redis-queue-patterns.md +889 -0
  35. data/docs/guides/redis-queue-production.md +1091 -0
  36. data/docs/index.md +64 -0
  37. data/docs/{dead_letter_queue.md → reference/dead-letter-queue.md} +2 -3
  38. data/docs/{logging.md → reference/logging.md} +1 -1
  39. data/docs/{message_deduplication.md → reference/message-deduplication.md} +1 -0
  40. data/docs/{proc_handlers_summary.md → reference/proc-handlers.md} +7 -6
  41. data/docs/{serializers.md → reference/serializers.md} +3 -5
  42. data/docs/{transports.md → reference/transports.md} +133 -11
  43. data/docs/transports/memory-transport.md +374 -0
  44. data/docs/transports/redis-enhanced-transport.md +524 -0
  45. data/docs/transports/redis-queue-transport.md +1304 -0
  46. data/docs/transports/redis-transport-comparison.md +496 -0
  47. data/docs/transports/redis-transport.md +509 -0
  48. data/examples/README.md +98 -5
  49. data/examples/city_scenario/911_emergency_call_flow.svg +99 -0
  50. data/examples/city_scenario/README.md +515 -0
  51. data/examples/city_scenario/ai_visitor_intelligence_flow.svg +108 -0
  52. data/examples/city_scenario/citizen.rb +195 -0
  53. data/examples/city_scenario/city_diagram.svg +125 -0
  54. data/examples/city_scenario/common/health_monitor.rb +80 -0
  55. data/examples/city_scenario/common/logger.rb +30 -0
  56. data/examples/city_scenario/emergency_dispatch_center.rb +270 -0
  57. data/examples/city_scenario/fire_department.rb +446 -0
  58. data/examples/city_scenario/fire_emergency_flow.svg +95 -0
  59. data/examples/city_scenario/health_department.rb +100 -0
  60. data/examples/city_scenario/health_monitoring_system.svg +130 -0
  61. data/examples/city_scenario/house.rb +244 -0
  62. data/examples/city_scenario/local_bank.rb +217 -0
  63. data/examples/city_scenario/messages/emergency_911_message.rb +81 -0
  64. data/examples/city_scenario/messages/emergency_resolved_message.rb +43 -0
  65. data/examples/city_scenario/messages/fire_dispatch_message.rb +43 -0
  66. data/examples/city_scenario/messages/fire_emergency_message.rb +45 -0
  67. data/examples/city_scenario/messages/health_check_message.rb +22 -0
  68. data/examples/city_scenario/messages/health_status_message.rb +35 -0
  69. data/examples/city_scenario/messages/police_dispatch_message.rb +46 -0
  70. data/examples/city_scenario/messages/silent_alarm_message.rb +38 -0
  71. data/examples/city_scenario/police_department.rb +316 -0
  72. data/examples/city_scenario/redis_monitor.rb +129 -0
  73. data/examples/city_scenario/redis_stats.rb +743 -0
  74. data/examples/city_scenario/room_for_improvement.md +240 -0
  75. data/examples/city_scenario/security_emergency_flow.svg +95 -0
  76. data/examples/city_scenario/service_internal_architecture.svg +154 -0
  77. data/examples/city_scenario/smart_message_ai_agent.rb +364 -0
  78. data/examples/city_scenario/start_demo.sh +236 -0
  79. data/examples/city_scenario/stop_demo.sh +106 -0
  80. data/examples/city_scenario/visitor.rb +631 -0
  81. data/examples/{10_message_deduplication.rb → memory/01_message_deduplication_demo.rb} +1 -1
  82. data/examples/{09_dead_letter_queue_demo.rb → memory/02_dead_letter_queue_demo.rb} +13 -40
  83. data/examples/{01_point_to_point_orders.rb → memory/03_point_to_point_orders.rb} +1 -1
  84. data/examples/{02_publish_subscribe_events.rb → memory/04_publish_subscribe_events.rb} +2 -2
  85. data/examples/{03_many_to_many_chat.rb → memory/05_many_to_many_chat.rb} +4 -4
  86. data/examples/{show_me.rb → memory/06_pretty_print_demo.rb} +1 -1
  87. data/examples/{05_proc_handlers.rb → memory/07_proc_handlers_demo.rb} +2 -2
  88. data/examples/{06_custom_logger_example.rb → memory/08_custom_logger_demo.rb} +17 -14
  89. data/examples/{07_error_handling_scenarios.rb → memory/09_error_handling_demo.rb} +4 -4
  90. data/examples/{08_entity_addressing_basic.rb → memory/10_entity_addressing_basic.rb} +8 -8
  91. data/examples/{08_entity_addressing_with_filtering.rb → memory/11_entity_addressing_with_filtering.rb} +6 -6
  92. data/examples/{09_regex_filtering_microservices.rb → memory/12_regex_filtering_microservices.rb} +2 -2
  93. data/examples/{10_header_block_configuration.rb → memory/13_header_block_configuration.rb} +6 -6
  94. data/examples/{11_global_configuration_example.rb → memory/14_global_configuration_demo.rb} +19 -8
  95. data/examples/{show_logger.rb → memory/15_logger_demo.rb} +1 -1
  96. data/examples/memory/README.md +163 -0
  97. data/examples/memory/memory_transport_architecture.svg +90 -0
  98. data/examples/memory/point_to_point_pattern.svg +94 -0
  99. data/examples/memory/publish_subscribe_pattern.svg +125 -0
  100. data/examples/{04_redis_smart_home_iot.rb → redis/01_smart_home_iot_demo.rb} +5 -5
  101. data/examples/redis/README.md +230 -0
  102. data/examples/redis/alert_system_flow.svg +127 -0
  103. data/examples/redis/dashboard_status_flow.svg +107 -0
  104. data/examples/redis/device_command_flow.svg +113 -0
  105. data/examples/redis/redis_transport_architecture.svg +115 -0
  106. data/examples/{smart_home_iot_dataflow.md → redis/smart_home_iot_dataflow.md} +4 -116
  107. data/examples/redis/smart_home_system_architecture.svg +133 -0
  108. data/examples/redis_enhanced/README.md +319 -0
  109. data/examples/redis_enhanced/enhanced_01_basic_patterns.rb +233 -0
  110. data/examples/redis_enhanced/enhanced_02_fluent_api.rb +331 -0
  111. data/examples/redis_enhanced/enhanced_03_dual_publishing.rb +281 -0
  112. data/examples/redis_enhanced/enhanced_04_advanced_routing.rb +419 -0
  113. data/examples/redis_queue/01_basic_messaging.rb +221 -0
  114. data/examples/redis_queue/01_comprehensive_examples.rb +508 -0
  115. data/examples/redis_queue/02_pattern_routing.rb +405 -0
  116. data/examples/redis_queue/03_fluent_api.rb +422 -0
  117. data/examples/redis_queue/04_load_balancing.rb +486 -0
  118. data/examples/redis_queue/05_microservices.rb +735 -0
  119. data/examples/redis_queue/06_emergency_alerts.rb +777 -0
  120. data/examples/redis_queue/07_queue_management.rb +587 -0
  121. data/examples/redis_queue/README.md +366 -0
  122. data/examples/redis_queue/enhanced_01_basic_patterns.rb +233 -0
  123. data/examples/redis_queue/enhanced_02_fluent_api.rb +331 -0
  124. data/examples/redis_queue/enhanced_03_dual_publishing.rb +281 -0
  125. data/examples/redis_queue/enhanced_04_advanced_routing.rb +419 -0
  126. data/examples/redis_queue/redis_queue_architecture.svg +148 -0
  127. data/ideas/README.md +41 -0
  128. data/ideas/agents.md +1001 -0
  129. data/ideas/database_transport.md +980 -0
  130. data/ideas/improvement.md +359 -0
  131. data/ideas/meshage.md +1788 -0
  132. data/ideas/message_discovery.md +178 -0
  133. data/ideas/message_schema.md +1381 -0
  134. data/lib/smart_message/.idea/.gitignore +8 -0
  135. data/lib/smart_message/.idea/markdown.xml +6 -0
  136. data/lib/smart_message/.idea/misc.xml +4 -0
  137. data/lib/smart_message/.idea/modules.xml +8 -0
  138. data/lib/smart_message/.idea/smart_message.iml +16 -0
  139. data/lib/smart_message/.idea/vcs.xml +6 -0
  140. data/lib/smart_message/addressing.rb +15 -0
  141. data/lib/smart_message/base.rb +0 -2
  142. data/lib/smart_message/configuration.rb +1 -1
  143. data/lib/smart_message/logger.rb +15 -4
  144. data/lib/smart_message/plugins.rb +5 -2
  145. data/lib/smart_message/serializer.rb +14 -0
  146. data/lib/smart_message/transport/redis_enhanced_transport.rb +399 -0
  147. data/lib/smart_message/transport/redis_queue_transport.rb +555 -0
  148. data/lib/smart_message/transport/registry.rb +1 -0
  149. data/lib/smart_message/transport.rb +34 -1
  150. data/lib/smart_message/version.rb +1 -1
  151. data/lib/smart_message.rb +5 -52
  152. data/mkdocs.yml +184 -0
  153. data/p2p_plan.md +326 -0
  154. data/p2p_roadmap.md +287 -0
  155. data/smart_message.gemspec +2 -0
  156. data/smart_message.svg +51 -0
  157. metadata +170 -44
  158. data/docs/README.md +0 -57
  159. data/examples/dead_letters.jsonl +0 -12
  160. data/examples/temp.txt +0 -94
  161. data/examples/tmux_chat/README.md +0 -283
  162. data/examples/tmux_chat/bot_agent.rb +0 -278
  163. data/examples/tmux_chat/human_agent.rb +0 -199
  164. data/examples/tmux_chat/room_monitor.rb +0 -160
  165. data/examples/tmux_chat/shared_chat_system.rb +0 -328
  166. data/examples/tmux_chat/start_chat_demo.sh +0 -190
  167. data/examples/tmux_chat/stop_chat_demo.sh +0 -22
  168. /data/docs/{properties.md → core-concepts/properties.md} +0 -0
  169. /data/docs/{ideas_to_think_about.md → development/ideas.md} +0 -0
@@ -0,0 +1,115 @@
1
+ <svg width="900" height="700" xmlns="http://www.w3.org/2000/svg" style="background: transparent;">
2
+ <defs>
3
+ <style>
4
+ .title { font: bold 18px sans-serif; fill: #e1e5e9; text-anchor: middle; }
5
+ .label { font: 14px sans-serif; fill: #c9d1d9; text-anchor: middle; }
6
+ .small-label { font: 11px sans-serif; fill: #8b949e; text-anchor: middle; }
7
+ .code-label { font: 10px monospace; fill: #f0f6fc; }
8
+ .service-name { font: 12px sans-serif; fill: #f0f6fc; text-anchor: middle; font-weight: bold; }
9
+ .api-gateway-box { fill: #0d1117; stroke: #f85149; stroke-width: 2; rx: 8; }
10
+ .web-service-box { fill: #0d1117; stroke: #56d364; stroke-width: 2; rx: 8; }
11
+ .db-service-box { fill: #0d1117; stroke: #a5a5ff; stroke-width: 2; rx: 8; }
12
+ .payment-service-box { fill: #0d1117; stroke: #ffa657; stroke-width: 2; rx: 8; }
13
+ .monitoring-box { fill: #161b22; stroke: #8b949e; stroke-width: 2; rx: 8; }
14
+ .message-flow { stroke: #58a6ff; stroke-width: 2; fill: none; marker-end: url(#arrowhead); }
15
+ .pattern-flow { stroke: #a5a5ff; stroke-width: 2; fill: none; marker-end: url(#arrowhead-purple); stroke-dasharray: 3,3; }
16
+ .alert-flow { stroke: #f85149; stroke-width: 2; fill: none; marker-end: url(#arrowhead-red); }
17
+ </style>
18
+ <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
19
+ <polygon points="0 0, 10 3.5, 0 7" fill="#58a6ff" />
20
+ </marker>
21
+ <marker id="arrowhead-purple" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
22
+ <polygon points="0 0, 10 3.5, 0 7" fill="#a5a5ff" />
23
+ </marker>
24
+ <marker id="arrowhead-red" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
25
+ <polygon points="0 0, 10 3.5, 0 7" fill="#f85149" />
26
+ </marker>
27
+ </defs>
28
+
29
+ <!-- Title -->
30
+ <text x="450" y="30" class="title">Redis Enhanced Transport: Microservices Routing</text>
31
+
32
+ <!-- API Gateway (Central Hub) -->
33
+ <rect x="350" y="80" width="200" height="80" class="api-gateway-box"/>
34
+ <text x="450" y="110" class="service-name">API Gateway</text>
35
+ <text x="450" y="130" class="small-label">Routes all incoming requests</text>
36
+ <text x="450" y="145" class="code-label">Publishes: *.api_gateway.*</text>
37
+
38
+ <!-- Web Service -->
39
+ <rect x="100" y="200" width="150" height="60" class="web-service-box"/>
40
+ <text x="175" y="225" class="service-name">Web Service</text>
41
+ <text x="175" y="245" class="code-label">Pattern: *.*.web_service</text>
42
+
43
+ <!-- User Service -->
44
+ <rect x="300" y="200" width="150" height="60" class="web-service-box"/>
45
+ <text x="375" y="225" class="service-name">User Service</text>
46
+ <text x="375" y="245" class="code-label">Pattern: *.*.user_service</text>
47
+
48
+ <!-- Order Service -->
49
+ <rect x="500" y="200" width="150" height="60" class="web-service-box"/>
50
+ <text x="575" y="225" class="service-name">Order Service</text>
51
+ <text x="575" y="245" class="code-label">Pattern: *.*.order_service</text>
52
+
53
+ <!-- Database Layer -->
54
+ <rect x="650" y="320" width="150" height="60" class="db-service-box"/>
55
+ <text x="725" y="345" class="service-name">Database Layer</text>
56
+ <text x="725" y="365" class="code-label">Pattern: *.*.database</text>
57
+
58
+ <!-- Payment Gateway -->
59
+ <rect x="100" y="320" width="150" height="60" class="payment-service-box"/>
60
+ <text x="175" y="345" class="service-name">Payment Service</text>
61
+ <text x="175" y="365" class="code-label">Pattern: *.payment.*</text>
62
+
63
+ <!-- Monitoring & Logging -->
64
+ <rect x="350" y="440" width="200" height="60" class="monitoring-box"/>
65
+ <text x="450" y="465" class="service-name">Monitoring Service</text>
66
+ <text x="450" y="485" class="code-label">Pattern: alertmessage.*.*</text>
67
+
68
+ <!-- Message Flows from API Gateway -->
69
+ <line x1="400" y1="160" x2="175" y2="200" class="message-flow"/>
70
+ <text x="280" y="175" class="code-label">usermessage.api_gateway.web_service</text>
71
+
72
+ <line x1="430" y1="160" x2="375" y2="200" class="message-flow"/>
73
+ <text x="410" y="175" class="code-label">authmessage.api_gateway.user_service</text>
74
+
75
+ <line x1="480" y1="160" x2="575" y2="200" class="message-flow"/>
76
+ <text x="540" y="175" class="code-label">ordermessage.api_gateway.order_service</text>
77
+
78
+ <!-- Internal Service Communications -->
79
+ <line x1="450" y1="260" x2="725" y2="320" class="pattern-flow"/>
80
+ <text x="590" y="290" class="code-label">querymessage.user_service.database</text>
81
+
82
+ <line x1="575" y1="260" x2="725" y2="320" class="pattern-flow"/>
83
+ <text x="650" y="305" class="code-label">ordersavemessage.order_service.database</text>
84
+
85
+ <line x1="375" y1="260" x2="175" y2="320" class="pattern-flow"/>
86
+ <text x="260" y="285" class="code-label">paymentmessage.user_service.payment</text>
87
+
88
+ <!-- Alert/Monitoring Flows -->
89
+ <line x1="175" y1="380" x2="400" y2="440" class="alert-flow"/>
90
+ <text x="240" y="415" class="code-label">alertmessage.payment.monitoring</text>
91
+
92
+ <line x1="725" y1="380" x2="500" y2="440" class="alert-flow"/>
93
+ <text x="620" y="415" class="code-label">alertmessage.database.monitoring</text>
94
+
95
+ <!-- Routing Patterns Legend -->
96
+ <rect x="50" y="520" width="800" height="160" class="api-gateway-box"/>
97
+ <text x="450" y="545" class="label">Common Routing Patterns</text>
98
+
99
+ <!-- Pattern Examples -->
100
+ <text x="100" y="570" class="service-name">Service-to-Service Communication:</text>
101
+ <text x="100" y="590" class="code-label">transport.where.from('api_gateway').to('user_service').subscribe</text>
102
+ <text x="100" y="605" class="small-label"># Receives: *.api_gateway.user_service</text>
103
+
104
+ <text x="100" y="630" class="service-name">Cross-Service Message Types:</text>
105
+ <text x="100" y="650" class="code-label">transport.where.type('PaymentMessage').subscribe</text>
106
+ <text x="100" y="665" class="small-label"># Receives: paymentmessage.*.*</text>
107
+
108
+ <text x="500" y="570" class="service-name">Alert Aggregation:</text>
109
+ <text x="500" y="590" class="code-label">transport.where.type('AlertMessage').to('monitoring').subscribe</text>
110
+ <text x="500" y="605" class="small-label"># Receives: alertmessage.*.monitoring</text>
111
+
112
+ <text x="500" y="630" class="service-name">Service Health Monitoring:</text>
113
+ <text x="500" y="650" class="code-label">transport.where.from('database').type('HealthMessage').subscribe</text>
114
+ <text x="500" y="665" class="small-label"># Receives: healthmessage.database.*</text>
115
+ </svg>
@@ -0,0 +1,107 @@
1
+ <svg width="900" height="500" xmlns="http://www.w3.org/2000/svg" style="background: transparent;">
2
+ <defs>
3
+ <style>
4
+ .title { font: bold 18px sans-serif; fill: #e1e5e9; text-anchor: middle; }
5
+ .label { font: 14px sans-serif; fill: #c9d1d9; text-anchor: middle; }
6
+ .small-label { font: 12px sans-serif; fill: #8b949e; text-anchor: middle; }
7
+ .code-label { font: 12px monospace; fill: #f0f6fc; }
8
+ .box { fill: #21262d; stroke: #30363d; stroke-width: 2; rx: 8; }
9
+ .pattern-box { fill: #0d1117; stroke: #a5a5ff; stroke-width: 2; rx: 6; }
10
+ .message-box { fill: #161b22; stroke: #56d364; stroke-width: 2; rx: 6; }
11
+ .match-box { fill: #0d1117; stroke: #ffa657; stroke-width: 2; rx: 6; }
12
+ .arrow { stroke: #58a6ff; stroke-width: 2; fill: none; marker-end: url(#arrowhead); }
13
+ .match-flow { stroke: #56d364; stroke-width: 3; fill: none; marker-end: url(#arrowhead-green); }
14
+ .no-match-flow { stroke: #f85149; stroke-width: 2; fill: none; marker-end: url(#arrowhead-red); stroke-dasharray: 5,5; }
15
+ </style>
16
+ <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
17
+ <polygon points="0 0, 10 3.5, 0 7" fill="#58a6ff" />
18
+ </marker>
19
+ <marker id="arrowhead-green" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
20
+ <polygon points="0 0, 10 3.5, 0 7" fill="#56d364" />
21
+ </marker>
22
+ <marker id="arrowhead-red" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
23
+ <polygon points="0 0, 10 3.5, 0 7" fill="#f85149" />
24
+ </marker>
25
+ </defs>
26
+
27
+ <!-- Title -->
28
+ <text x="450" y="30" class="title">Redis Enhanced Transport: Pattern Matching</text>
29
+
30
+ <!-- Pattern Subscriptions Section -->
31
+ <text x="150" y="65" class="label">Pattern Subscriptions</text>
32
+
33
+ <!-- Pattern Examples -->
34
+ <rect x="50" y="80" width="200" height="30" class="pattern-box"/>
35
+ <text x="60" y="100" class="code-label">ordermessage.*.*</text>
36
+
37
+ <rect x="50" y="120" width="200" height="30" class="pattern-box"/>
38
+ <text x="60" y="140" class="code-label">*.payment_gateway.*</text>
39
+
40
+ <rect x="50" y="160" width="200" height="30" class="pattern-box"/>
41
+ <text x="60" y="180" class="code-label">alertmessage.*.*</text>
42
+
43
+ <!-- Messages Section -->
44
+ <text x="500" y="65" class="label">Incoming Messages</text>
45
+
46
+ <!-- Message Examples -->
47
+ <rect x="350" y="80" width="300" height="30" class="message-box"/>
48
+ <text x="360" y="100" class="code-label">ordermessage.api_gateway.order_service</text>
49
+
50
+ <rect x="350" y="120" width="300" height="30" class="message-box"/>
51
+ <text x="360" y="140" class="code-label">paymessage.payment_gateway.bank_api</text>
52
+
53
+ <rect x="350" y="160" width="300" height="30" class="message-box"/>
54
+ <text x="360" y="180" class="code-label">alertmessage.monitoring.admin_panel</text>
55
+
56
+ <rect x="350" y="200" width="300" height="30" class="message-box"/>
57
+ <text x="360" y="220" class="code-label">logmessage.web_server.log_aggregator</text>
58
+
59
+ <!-- Matching Results -->
60
+ <text x="750" y="65" class="label">Match Results</text>
61
+
62
+ <rect x="680" y="80" width="60" height="30" class="match-box"/>
63
+ <text x="710" y="100" class="small-label">✓ MATCH</text>
64
+
65
+ <rect x="680" y="120" width="60" height="30" class="match-box"/>
66
+ <text x="710" y="140" class="small-label">✓ MATCH</text>
67
+
68
+ <rect x="680" y="160" width="60" height="30" class="match-box"/>
69
+ <text x="710" y="180" class="small-label">✓ MATCH</text>
70
+
71
+ <rect x="680" y="200" width="60" height="30" class="box"/>
72
+ <text x="710" y="220" class="small-label">✗ NO MATCH</text>
73
+
74
+ <!-- Arrows showing matching -->
75
+ <line x1="250" y1="95" x2="350" y2="95" class="arrow"/>
76
+ <line x1="650" y1="95" x2="680" y2="95" class="match-flow"/>
77
+
78
+ <line x1="250" y1="135" x2="350" y2="135" class="arrow"/>
79
+ <line x1="650" y1="135" x2="680" y2="135" class="match-flow"/>
80
+
81
+ <line x1="250" y1="175" x2="350" y2="175" class="arrow"/>
82
+ <line x1="650" y1="175" x2="680" y2="175" class="match-flow"/>
83
+
84
+ <line x1="650" y1="215" x2="680" y2="215" class="no-match-flow"/>
85
+
86
+ <!-- Wildcard Legend -->
87
+ <rect x="50" y="260" width="800" height="180" class="box"/>
88
+ <text x="450" y="285" class="label">Pattern Wildcard Guide</text>
89
+
90
+ <!-- Single Wildcard Examples -->
91
+ <text x="200" y="310" class="label">Single Wildcard (*)</text>
92
+ <text x="80" y="335" class="code-label">Pattern: *.payment_gateway.*</text>
93
+ <text x="80" y="355" class="small-label">✓ Matches: ordermessage.payment_gateway.bank_api</text>
94
+ <text x="80" y="375" class="small-label">✓ Matches: alertmessage.payment_gateway.admin_panel</text>
95
+ <text x="80" y="395" class="small-label">✗ No Match: payment_gateway.bank_api (missing first segment)</text>
96
+
97
+ <!-- Multiple Wildcard Examples -->
98
+ <text x="650" y="310" class="label">Multiple Wildcards</text>
99
+ <text x="500" y="335" class="code-label">Pattern: ordermessage.*.*</text>
100
+ <text x="500" y="355" class="small-label">✓ Matches: ordermessage.api.service</text>
101
+ <text x="500" y="375" class="small-label">✓ Matches: ordermessage.web.database</text>
102
+ <text x="500" y="395" class="small-label">✗ No Match: ordermessage.api (too few segments)</text>
103
+
104
+ <!-- Key Benefits -->
105
+ <text x="450" y="450" class="label">Key Benefits: Flexible routing + RabbitMQ-style patterns + Redis performance</text>
106
+ <text x="450" y="470" class="small-label">Perfect for microservices requiring intelligent message routing without complex infrastructure</text>
107
+ </svg>
@@ -0,0 +1,59 @@
1
+ <svg width="900" height="500" xmlns="http://www.w3.org/2000/svg" style="background: transparent;">
2
+ <defs>
3
+ <style>
4
+ .title { font: bold 18px sans-serif; fill: #e1e5e9; text-anchor: middle; }
5
+ .subtitle { font: 16px sans-serif; fill: #c9d1d9; text-anchor: middle; }
6
+ .code { font: 14px 'Courier New', monospace; fill: #79c0ff; }
7
+ .comment { font: 12px 'Courier New', monospace; fill: #8b949e; }
8
+ .string { font: 14px 'Courier New', monospace; fill: #a5c261; }
9
+ .keyword { font: 14px 'Courier New', monospace; fill: #ff7b72; }
10
+ .method { font: 14px 'Courier New', monospace; fill: #ffa657; }
11
+ .pattern-result { font: 12px 'Courier New', monospace; fill: #56d364; }
12
+ .box { fill: #21262d; stroke: #30363d; stroke-width: 2; rx: 8; }
13
+ .highlight-box { fill: #0d1117; stroke: #a5a5ff; stroke-width: 2; rx: 8; }
14
+ .result-box { fill: #161b22; stroke: #56d364; stroke-width: 2; rx: 6; }
15
+ </style>
16
+ </defs>
17
+
18
+ <!-- Title -->
19
+ <text x="450" y="30" class="title">Redis Enhanced Transport - Fluent API Examples</text>
20
+
21
+ <!-- Basic Examples -->
22
+ <rect x="50" y="60" width="800" height="140" class="box"/>
23
+ <text x="450" y="85" class="subtitle">Basic Fluent API Patterns</text>
24
+
25
+ <!-- From subscription -->
26
+ <text x="70" y="110" class="comment">// Subscribe to all messages FROM a specific service</text>
27
+ <text x="70" y="130" class="code">transport.</text><text x="170" y="130" class="method">where</text><text x="220" y="130" class="code">().</text><text x="260" y="130" class="method">from</text><text x="300" y="130" class="code">(</text><text x="310" y="130" class="string">'api-gateway'</text><text x="420" y="130" class="code">).</text><text x="460" y="130" class="method">subscribe</text>
28
+ <text x="70" y="150" class="pattern-result">→ Pattern: *.api-gateway.*</text>
29
+
30
+ <!-- To subscription -->
31
+ <text x="70" y="175" class="comment">// Subscribe to all messages TO a specific service</text>
32
+ <text x="70" y="195" class="code">transport.</text><text x="170" y="195" class="method">where</text><text x="220" y="195" class="code">().</text><text x="260" y="195" class="method">to</text><text x="290" y="195" class="code">(</text><text x="300" y="195" class="string">'user-service'</text><text x="420" y="195" class="code">).</text><text x="460" y="195" class="method">subscribe</text>
33
+ <text x="70" y="215" class="pattern-result">→ Pattern: *.*.user-service</text>
34
+
35
+ <!-- Combined Examples -->
36
+ <rect x="50" y="220" width="800" height="160" class="highlight-box"/>
37
+ <text x="450" y="245" class="subtitle">Combined Conditions</text>
38
+
39
+ <!-- Two conditions -->
40
+ <text x="70" y="270" class="comment">// FROM web-app TO user-service</text>
41
+ <text x="70" y="290" class="code">transport.</text><text x="170" y="290" class="method">where</text><text x="220" y="290" class="code">().</text><text x="260" y="290" class="method">from</text><text x="300" y="290" class="code">(</text><text x="310" y="290" class="string">'web-app'</text><text x="390" y="290" class="code">).</text><text x="430" y="290" class="method">to</text><text x="460" y="290" class="code">(</text><text x="470" y="290" class="string">'user-service'</text><text x="580" y="290" class="code">).</text><text x="620" y="290" class="method">subscribe</text>
42
+ <text x="70" y="310" class="pattern-result">→ Pattern: *.web-app.user-service</text>
43
+
44
+ <!-- Three conditions -->
45
+ <text x="70" y="335" class="comment">// Specific message TYPE from monitoring TO admin</text>
46
+ <text x="70" y="355" class="code">transport.</text><text x="170" y="355" class="method">where</text><text x="220" y="355" class="code">().</text><text x="260" y="355" class="method">type</text><text x="300" y="355" class="code">(</text><text x="310" y="355" class="string">'AlertMessage'</text><text x="430" y="355" class="code">).</text><text x="470" y="355" class="method">from</text><text x="510" y="355" class="code">(</text><text x="520" y="355" class="string">'monitoring'</text><text x="620" y="355" class="code">).</text><text x="660" y="355" class="method">to</text><text x="690" y="355" class="code">(</text><text x="700" y="355" class="string">'admin'</text><text x="750" y="355" class="code">)</text>
47
+ <text x="70" y="375" class="pattern-result">→ Pattern: alertmessage.monitoring.admin</text>
48
+
49
+ <!-- Convenience vs Fluent -->
50
+ <rect x="50" y="400" width="400" height="80" class="result-box"/>
51
+ <text x="250" y="425" class="subtitle">Convenience Methods</text>
52
+ <text x="70" y="450" class="code">transport.</text><text x="170" y="450" class="method">subscribe_to_alerts</text><text x="320" y="450" class="code">()</text>
53
+ <text x="70" y="470" class="comment">// Multiple alert patterns automatically</text>
54
+
55
+ <rect x="470" y="400" width="380" height="80" class="result-box"/>
56
+ <text x="660" y="425" class="subtitle">Equivalent Fluent</text>
57
+ <text x="490" y="445" class="code">transport.</text><text x="590" y="445" class="method">where</text><text x="640" y="445" class="code">().</text><text x="680" y="445" class="method">type</text><text x="720" y="445" class="code">(</text><text x="730" y="445" class="string">'AlertMessage'</text><text x="840" y="445" class="code">)</text>
58
+ <text x="490" y="465" class="code"> .</text><text x="530" y="465" class="method">subscribe</text>
59
+ </svg>
@@ -0,0 +1,161 @@
1
+ <svg width="900" height="600" xmlns="http://www.w3.org/2000/svg" style="background: transparent;">
2
+ <defs>
3
+ <style>
4
+ .title { font: bold 20px sans-serif; fill: #e1e5e9; text-anchor: middle; }
5
+ .subtitle { font: 16px sans-serif; fill: #c9d1d9; text-anchor: middle; }
6
+ .label { font: 14px sans-serif; fill: #c9d1d9; }
7
+ .small-label { font: 12px sans-serif; fill: #8b949e; }
8
+ .value-label { font: 12px sans-serif; fill: #f0f6fc; text-anchor: middle; }
9
+ .chart-bg { fill: #161b22; stroke: #30363d; stroke-width: 1; }
10
+ .axis { stroke: #30363d; stroke-width: 2; }
11
+ .bar-basic { fill: #58a6ff; }
12
+ .bar-enhanced { fill: #a5a5ff; }
13
+ .bar-queue { fill: #56d364; }
14
+ .grid { stroke: #21262d; stroke-width: 1; opacity: 0.5; }
15
+ </style>
16
+ </defs>
17
+
18
+ <!-- Title -->
19
+ <text x="450" y="30" class="title">Redis Transport Performance Comparison</text>
20
+
21
+ <!-- Latency Chart -->
22
+ <rect x="50" y="60" width="380" height="200" class="chart-bg"/>
23
+ <text x="240" y="85" class="subtitle">Latency (Lower is Better)</text>
24
+
25
+ <!-- Y-axis labels for latency -->
26
+ <text x="45" y="110" class="small-label">2ms</text>
27
+ <text x="45" y="140" class="small-label">1.5ms</text>
28
+ <text x="45" y="170" class="small-label">1ms</text>
29
+ <text x="45" y="200" class="small-label">0.5ms</text>
30
+ <text x="45" y="230" class="small-label">0ms</text>
31
+
32
+ <!-- Grid lines -->
33
+ <line x1="60" y1="110" x2="420" y2="110" class="grid"/>
34
+ <line x1="60" y1="140" x2="420" y2="140" class="grid"/>
35
+ <line x1="60" y1="170" x2="420" y2="170" class="grid"/>
36
+ <line x1="60" y1="200" x2="420" y2="200" class="grid"/>
37
+
38
+ <!-- Axes -->
39
+ <line x1="60" y1="100" x2="60" y2="240" class="axis"/>
40
+ <line x1="60" y1="240" x2="420" y2="240" class="axis"/>
41
+
42
+ <!-- Latency Bars -->
43
+ <rect x="80" y="200" width="60" height="40" class="bar-basic"/>
44
+ <text x="110" y="255" class="value-label">Basic</text>
45
+ <text x="110" y="270" class="small-label">1.0ms</text>
46
+
47
+ <rect x="180" y="188" width="60" height="52" class="bar-enhanced"/>
48
+ <text x="210" y="255" class="value-label">Enhanced</text>
49
+ <text x="210" y="270" class="small-label">1.2ms</text>
50
+
51
+ <rect x="280" y="220" width="60" height="20" class="bar-queue"/>
52
+ <text x="310" y="255" class="value-label">Queue</text>
53
+ <text x="310" y="270" class="small-label">0.5ms</text>
54
+
55
+ <!-- Throughput Chart -->
56
+ <rect x="470" y="60" width="380" height="200" class="chart-bg"/>
57
+ <text x="660" y="85" class="subtitle">Throughput (Higher is Better)</text>
58
+
59
+ <!-- Y-axis labels for throughput -->
60
+ <text x="465" y="110" class="small-label">120K</text>
61
+ <text x="465" y="140" class="small-label">100K</text>
62
+ <text x="465" y="170" class="small-label">80K</text>
63
+ <text x="465" y="200" class="small-label">60K</text>
64
+ <text x="465" y="230" class="small-label">40K</text>
65
+
66
+ <!-- Grid lines -->
67
+ <line x1="480" y1="110" x2="840" y2="110" class="grid"/>
68
+ <line x1="480" y1="140" x2="840" y2="140" class="grid"/>
69
+ <line x1="480" y1="170" x2="840" y2="170" class="grid"/>
70
+ <line x1="480" y1="200" x2="840" y2="200" class="grid"/>
71
+
72
+ <!-- Axes -->
73
+ <line x1="480" y1="100" x2="480" y2="240" class="axis"/>
74
+ <line x1="480" y1="240" x2="840" y2="240" class="axis"/>
75
+
76
+ <!-- Throughput Bars -->
77
+ <rect x="500" y="160" width="60" height="80" class="bar-basic"/>
78
+ <text x="530" y="255" class="value-label">Basic</text>
79
+ <text x="530" y="270" class="small-label">80K msg/s</text>
80
+
81
+ <rect x="600" y="165" width="60" height="75" class="bar-enhanced"/>
82
+ <text x="630" y="255" class="value-label">Enhanced</text>
83
+ <text x="630" y="270" class="small-label">75K msg/s</text>
84
+
85
+ <rect x="700" y="120" width="60" height="120" class="bar-queue"/>
86
+ <text x="730" y="255" class="value-label">Queue</text>
87
+ <text x="730" y="270" class="small-label">100K+ msg/s</text>
88
+
89
+ <!-- Memory Usage Chart -->
90
+ <rect x="50" y="300" width="380" height="200" class="chart-bg"/>
91
+ <text x="240" y="325" class="subtitle">Memory per Consumer (Lower is Better)</text>
92
+
93
+ <!-- Y-axis labels for memory -->
94
+ <text x="45" y="350" class="small-label">10MB</text>
95
+ <text x="45" y="380" class="small-label">8MB</text>
96
+ <text x="45" y="410" class="small-label">6MB</text>
97
+ <text x="45" y="440" class="small-label">4MB</text>
98
+ <text x="45" y="470" class="small-label">2MB</text>
99
+
100
+ <!-- Grid lines -->
101
+ <line x1="60" y1="350" x2="420" y2="350" class="grid"/>
102
+ <line x1="60" y1="380" x2="420" y2="380" class="grid"/>
103
+ <line x1="60" y1="410" x2="420" y2="410" class="grid"/>
104
+ <line x1="60" y1="440" x2="420" y2="440" class="grid"/>
105
+
106
+ <!-- Axes -->
107
+ <line x1="60" y1="340" x2="60" y2="480" class="axis"/>
108
+ <line x1="60" y1="480" x2="420" y2="480" class="axis"/>
109
+
110
+ <!-- Memory Bars -->
111
+ <rect x="80" y="460" width="60" height="20" class="bar-basic"/>
112
+ <text x="110" y="495" class="value-label">Basic</text>
113
+ <text x="110" y="510" class="small-label">~1MB</text>
114
+
115
+ <rect x="180" y="440" width="60" height="40" class="bar-enhanced"/>
116
+ <text x="210" y="495" class="value-label">Enhanced</text>
117
+ <text x="210" y="510" class="small-label">~2MB</text>
118
+
119
+ <rect x="280" y="455" width="60" height="25" class="bar-queue"/>
120
+ <text x="310" y="495" class="value-label">Queue</text>
121
+ <text x="310" y="510" class="small-label">~1.5MB</text>
122
+
123
+ <!-- Concurrent Consumers Chart -->
124
+ <rect x="470" y="300" width="380" height="200" class="chart-bg"/>
125
+ <text x="660" y="325" class="subtitle">Max Concurrent Consumers</text>
126
+
127
+ <!-- Y-axis labels for consumers -->
128
+ <text x="465" y="350" class="small-label">1200</text>
129
+ <text x="465" y="380" class="small-label">1000</text>
130
+ <text x="465" y="410" class="small-label">800</text>
131
+ <text x="465" y="440" class="small-label">600</text>
132
+ <text x="465" y="470" class="small-label">400</text>
133
+
134
+ <!-- Grid lines -->
135
+ <line x1="480" y1="350" x2="840" y2="350" class="grid"/>
136
+ <line x1="480" y1="380" x2="840" y2="380" class="grid"/>
137
+ <line x1="480" y1="410" x2="840" y2="410" class="grid"/>
138
+ <line x1="480" y1="440" x2="840" y2="440" class="grid"/>
139
+
140
+ <!-- Axes -->
141
+ <line x1="480" y1="340" x2="480" y2="480" class="axis"/>
142
+ <line x1="480" y1="480" x2="840" y2="480" class="axis"/>
143
+
144
+ <!-- Consumer Bars -->
145
+ <rect x="500" y="440" width="60" height="40" class="bar-basic"/>
146
+ <text x="530" y="495" class="value-label">Basic</text>
147
+ <text x="530" y="510" class="small-label">~200</text>
148
+
149
+ <rect x="600" y="435" width="60" height="45" class="bar-enhanced"/>
150
+ <text x="630" y="495" class="value-label">Enhanced</text>
151
+ <text x="630" y="510" class="small-label">~250</text>
152
+
153
+ <rect x="700" y="360" width="60" height="120" class="bar-queue"/>
154
+ <text x="730" y="495" class="value-label">Queue</text>
155
+ <text x="730" y="510" class="small-label">~1000+</text>
156
+
157
+ <!-- Summary -->
158
+ <text x="450" y="550" class="subtitle">Performance Summary</text>
159
+ <text x="220" y="575" class="small-label">🏆 Queue Transport leads in throughput and concurrency</text>
160
+ <text x="680" y="575" class="small-label">🏆 Basic Transport has lowest latency for simple cases</text>
161
+ </svg>
@@ -0,0 +1,53 @@
1
+ <svg width="800" height="300" xmlns="http://www.w3.org/2000/svg" style="background: transparent;">
2
+ <defs>
3
+ <style>
4
+ .title { font: bold 18px sans-serif; fill: #e1e5e9; text-anchor: middle; }
5
+ .label { font: 14px sans-serif; fill: #c9d1d9; text-anchor: middle; }
6
+ .small-label { font: 12px sans-serif; fill: #8b949e; text-anchor: middle; }
7
+ .box { fill: #21262d; stroke: #30363d; stroke-width: 2; rx: 8; }
8
+ .highlight-box { fill: #0d1117; stroke: #f85149; stroke-width: 2; rx: 8; }
9
+ .arrow { stroke: #58a6ff; stroke-width: 2; fill: none; marker-end: url(#arrowhead); }
10
+ .data-flow { stroke: #56d364; stroke-width: 2; fill: none; marker-end: url(#arrowhead-green); }
11
+ </style>
12
+ <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
13
+ <polygon points="0 0, 10 3.5, 0 7" fill="#58a6ff" />
14
+ </marker>
15
+ <marker id="arrowhead-green" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
16
+ <polygon points="0 0, 10 3.5, 0 7" fill="#56d364" />
17
+ </marker>
18
+ </defs>
19
+
20
+ <!-- Title -->
21
+ <text x="400" y="30" class="title">Redis Basic Transport Architecture</text>
22
+
23
+ <!-- Publisher -->
24
+ <rect x="50" y="80" width="120" height="60" class="box"/>
25
+ <text x="110" y="105" class="label">Publisher</text>
26
+ <text x="110" y="125" class="small-label">OrderMessage</text>
27
+
28
+ <!-- Redis Server -->
29
+ <rect x="340" y="80" width="120" height="60" class="highlight-box"/>
30
+ <text x="400" y="100" class="label">Redis Server</text>
31
+ <text x="400" y="115" class="small-label">Channel:</text>
32
+ <text x="400" y="130" class="small-label">"OrderMessage"</text>
33
+
34
+ <!-- Subscriber -->
35
+ <rect x="630" y="80" width="120" height="60" class="box"/>
36
+ <text x="690" y="105" class="label">Subscriber</text>
37
+ <text x="690" y="125" class="small-label">Thread-based</text>
38
+
39
+ <!-- Arrows -->
40
+ <line x1="170" y1="110" x2="340" y2="110" class="arrow"/>
41
+ <text x="255" y="105" class="small-label">PUBLISH</text>
42
+
43
+ <line x1="460" y1="110" x2="630" y2="110" class="data-flow"/>
44
+ <text x="545" y="105" class="small-label">SUBSCRIBE</text>
45
+
46
+ <!-- Key Features -->
47
+ <text x="400" y="180" class="label">Key Characteristics:</text>
48
+ <text x="400" y="200" class="small-label">• Direct Redis pub/sub channels</text>
49
+ <text x="400" y="215" class="small-label">• Channel name = Message class name</text>
50
+ <text x="400" y="230" class="small-label">• No pattern matching or persistence</text>
51
+ <text x="400" y="245" class="small-label">• Simplest implementation, lowest overhead</text>
52
+ <text x="400" y="260" class="small-label">• Fire-and-forget messaging</text>
53
+ </svg>
@@ -0,0 +1,88 @@
1
+ <svg width="900" height="400" xmlns="http://www.w3.org/2000/svg" style="background: transparent;">
2
+ <defs>
3
+ <style>
4
+ .title { font: bold 18px sans-serif; fill: #e1e5e9; text-anchor: middle; }
5
+ .label { font: 14px sans-serif; fill: #c9d1d9; text-anchor: middle; }
6
+ .small-label { font: 12px sans-serif; fill: #8b949e; text-anchor: middle; }
7
+ .box { fill: #21262d; stroke: #30363d; stroke-width: 2; rx: 8; }
8
+ .highlight-box { fill: #0d1117; stroke: #f85149; stroke-width: 2; rx: 8; }
9
+ .enhanced-box { fill: #0d1117; stroke: #a5a5ff; stroke-width: 2; rx: 8; }
10
+ .pattern-box { fill: #161b22; stroke: #ffa657; stroke-width: 2; rx: 6; }
11
+ .arrow { stroke: #58a6ff; stroke-width: 2; fill: none; marker-end: url(#arrowhead); }
12
+ .data-flow { stroke: #56d364; stroke-width: 2; fill: none; marker-end: url(#arrowhead-green); }
13
+ .dual-flow { stroke: #ffa657; stroke-width: 2; fill: none; marker-end: url(#arrowhead-orange); }
14
+ </style>
15
+ <marker id="arrowhead" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
16
+ <polygon points="0 0, 10 3.5, 0 7" fill="#58a6ff" />
17
+ </marker>
18
+ <marker id="arrowhead-green" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
19
+ <polygon points="0 0, 10 3.5, 0 7" fill="#56d364" />
20
+ </marker>
21
+ <marker id="arrowhead-orange" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
22
+ <polygon points="0 0, 10 3.5, 0 7" fill="#ffa657" />
23
+ </marker>
24
+ </defs>
25
+
26
+ <!-- Title -->
27
+ <text x="450" y="30" class="title">Redis Enhanced Transport Architecture</text>
28
+
29
+ <!-- Publisher -->
30
+ <rect x="50" y="80" width="120" height="80" class="box"/>
31
+ <text x="110" y="105" class="label">Publisher</text>
32
+ <text x="110" y="125" class="small-label">OrderMessage</text>
33
+ <text x="110" y="140" class="small-label">from: 'api'</text>
34
+ <text x="110" y="155" class="small-label">to: 'order-svc'</text>
35
+
36
+ <!-- Enhanced Router -->
37
+ <rect x="250" y="80" width="140" height="80" class="enhanced-box"/>
38
+ <text x="320" y="105" class="label">Enhanced Router</text>
39
+ <text x="320" y="125" class="small-label">3-part naming:</text>
40
+ <text x="320" y="140" class="small-label">message_type</text>
41
+ <text x="320" y="155" class="small-label">.from.to</text>
42
+
43
+ <!-- Dual Channels -->
44
+ <rect x="470" y="50" width="150" height="50" class="highlight-box"/>
45
+ <text x="545" y="70" class="small-label">Original Channel:</text>
46
+ <text x="545" y="85" class="small-label">"OrderMessage"</text>
47
+
48
+ <rect x="470" y="120" width="150" height="50" class="enhanced-box"/>
49
+ <text x="545" y="140" class="small-label">Enhanced Channel:</text>
50
+ <text x="545" y="155" class="small-label">"ordermessage.api.order_svc"</text>
51
+
52
+ <!-- Pattern Matcher -->
53
+ <rect x="700" y="80" width="150" height="80" class="pattern-box"/>
54
+ <text x="775" y="105" class="label">Pattern Matcher</text>
55
+ <text x="775" y="125" class="small-label">Wildcards:</text>
56
+ <text x="775" y="140" class="small-label">• ordermessage.*.*</text>
57
+ <text x="775" y="155" class="small-label">• *.api.*</text>
58
+
59
+ <!-- Arrows -->
60
+ <line x1="170" y1="120" x2="250" y2="120" class="arrow"/>
61
+
62
+ <!-- Dual publishing arrows -->
63
+ <line x1="390" y1="100" x2="470" y2="75" class="dual-flow"/>
64
+ <line x1="390" y1="140" x2="470" y2="145" class="dual-flow"/>
65
+
66
+ <!-- To pattern matcher -->
67
+ <line x1="620" y1="145" x2="700" y2="130" class="data-flow"/>
68
+
69
+ <!-- Fluent API Example -->
70
+ <rect x="50" y="200" width="800" height="120" class="pattern-box"/>
71
+ <text x="450" y="225" class="label">Enhanced Features</text>
72
+
73
+ <text x="150" y="250" class="small-label">Pattern Subscriptions:</text>
74
+ <text x="150" y="265" class="small-label">transport.subscribe_pattern("*.api.*")</text>
75
+ <text x="150" y="280" class="small-label">transport.subscribe_to_alerts()</text>
76
+
77
+ <text x="450" y="250" class="small-label">Fluent API:</text>
78
+ <text x="450" y="265" class="small-label">transport.where.from('api')</text>
79
+ <text x="450" y="280" class="small-label"> .to('order-svc').subscribe</text>
80
+
81
+ <text x="700" y="250" class="small-label">Backwards Compatible:</text>
82
+ <text x="700" y="265" class="small-label">• Publishes to both channels</text>
83
+ <text x="700" y="280" class="small-label">• Basic Redis can still subscribe</text>
84
+
85
+ <!-- Key Benefits -->
86
+ <text x="450" y="350" class="label">Key Benefits: RabbitMQ-style routing + Redis performance + Backwards compatibility</text>
87
+ <text x="450" y="370" class="small-label">Perfect for microservices requiring intelligent routing without message persistence</text>
88
+ </svg>