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.
- checksums.yaml +4 -4
- data/.github/workflows/deploy-github-pages.yml +38 -0
- data/.gitignore +5 -0
- data/CHANGELOG.md +30 -0
- data/Gemfile.lock +35 -4
- data/README.md +169 -71
- data/Rakefile +29 -4
- data/docs/assets/images/ddq_architecture.svg +130 -0
- data/docs/assets/images/dlq_architecture.svg +115 -0
- data/docs/assets/images/enhanced-dual-publishing.svg +136 -0
- data/docs/assets/images/enhanced-fluent-api.svg +149 -0
- data/docs/assets/images/enhanced-microservices-routing.svg +115 -0
- data/docs/assets/images/enhanced-pattern-matching.svg +107 -0
- data/docs/assets/images/fluent-api-demo.svg +59 -0
- data/docs/assets/images/performance-comparison.svg +161 -0
- data/docs/assets/images/redis-basic-architecture.svg +53 -0
- data/docs/assets/images/redis-enhanced-architecture.svg +88 -0
- data/docs/assets/images/redis-queue-architecture.svg +101 -0
- data/docs/assets/images/smart_message.jpg +0 -0
- data/docs/assets/images/smart_message_walking.jpg +0 -0
- data/docs/assets/images/smartmessage_architecture_overview.svg +173 -0
- data/docs/assets/images/transport-comparison-matrix.svg +171 -0
- data/docs/assets/javascripts/mathjax.js +17 -0
- data/docs/assets/stylesheets/extra.css +51 -0
- data/docs/{addressing.md → core-concepts/addressing.md} +5 -7
- data/docs/{architecture.md → core-concepts/architecture.md} +78 -138
- data/docs/{dispatcher.md → core-concepts/dispatcher.md} +21 -21
- data/docs/{message_filtering.md → core-concepts/message-filtering.md} +2 -3
- data/docs/{message_processing.md → core-concepts/message-processing.md} +17 -17
- data/docs/{troubleshooting.md → development/troubleshooting.md} +7 -7
- data/docs/{examples.md → getting-started/examples.md} +115 -89
- data/docs/{getting-started.md → getting-started/quick-start.md} +47 -18
- data/docs/guides/redis-queue-getting-started.md +697 -0
- data/docs/guides/redis-queue-patterns.md +889 -0
- data/docs/guides/redis-queue-production.md +1091 -0
- data/docs/index.md +64 -0
- data/docs/{dead_letter_queue.md → reference/dead-letter-queue.md} +2 -3
- data/docs/{logging.md → reference/logging.md} +1 -1
- data/docs/{message_deduplication.md → reference/message-deduplication.md} +1 -0
- data/docs/{proc_handlers_summary.md → reference/proc-handlers.md} +7 -6
- data/docs/{serializers.md → reference/serializers.md} +3 -5
- data/docs/{transports.md → reference/transports.md} +133 -11
- data/docs/transports/memory-transport.md +374 -0
- data/docs/transports/redis-enhanced-transport.md +524 -0
- data/docs/transports/redis-queue-transport.md +1304 -0
- data/docs/transports/redis-transport-comparison.md +496 -0
- data/docs/transports/redis-transport.md +509 -0
- data/examples/README.md +98 -5
- data/examples/city_scenario/911_emergency_call_flow.svg +99 -0
- data/examples/city_scenario/README.md +515 -0
- data/examples/city_scenario/ai_visitor_intelligence_flow.svg +108 -0
- data/examples/city_scenario/citizen.rb +195 -0
- data/examples/city_scenario/city_diagram.svg +125 -0
- data/examples/city_scenario/common/health_monitor.rb +80 -0
- data/examples/city_scenario/common/logger.rb +30 -0
- data/examples/city_scenario/emergency_dispatch_center.rb +270 -0
- data/examples/city_scenario/fire_department.rb +446 -0
- data/examples/city_scenario/fire_emergency_flow.svg +95 -0
- data/examples/city_scenario/health_department.rb +100 -0
- data/examples/city_scenario/health_monitoring_system.svg +130 -0
- data/examples/city_scenario/house.rb +244 -0
- data/examples/city_scenario/local_bank.rb +217 -0
- data/examples/city_scenario/messages/emergency_911_message.rb +81 -0
- data/examples/city_scenario/messages/emergency_resolved_message.rb +43 -0
- data/examples/city_scenario/messages/fire_dispatch_message.rb +43 -0
- data/examples/city_scenario/messages/fire_emergency_message.rb +45 -0
- data/examples/city_scenario/messages/health_check_message.rb +22 -0
- data/examples/city_scenario/messages/health_status_message.rb +35 -0
- data/examples/city_scenario/messages/police_dispatch_message.rb +46 -0
- data/examples/city_scenario/messages/silent_alarm_message.rb +38 -0
- data/examples/city_scenario/police_department.rb +316 -0
- data/examples/city_scenario/redis_monitor.rb +129 -0
- data/examples/city_scenario/redis_stats.rb +743 -0
- data/examples/city_scenario/room_for_improvement.md +240 -0
- data/examples/city_scenario/security_emergency_flow.svg +95 -0
- data/examples/city_scenario/service_internal_architecture.svg +154 -0
- data/examples/city_scenario/smart_message_ai_agent.rb +364 -0
- data/examples/city_scenario/start_demo.sh +236 -0
- data/examples/city_scenario/stop_demo.sh +106 -0
- data/examples/city_scenario/visitor.rb +631 -0
- data/examples/{10_message_deduplication.rb → memory/01_message_deduplication_demo.rb} +1 -1
- data/examples/{09_dead_letter_queue_demo.rb → memory/02_dead_letter_queue_demo.rb} +13 -40
- data/examples/{01_point_to_point_orders.rb → memory/03_point_to_point_orders.rb} +1 -1
- data/examples/{02_publish_subscribe_events.rb → memory/04_publish_subscribe_events.rb} +2 -2
- data/examples/{03_many_to_many_chat.rb → memory/05_many_to_many_chat.rb} +4 -4
- data/examples/{show_me.rb → memory/06_pretty_print_demo.rb} +1 -1
- data/examples/{05_proc_handlers.rb → memory/07_proc_handlers_demo.rb} +2 -2
- data/examples/{06_custom_logger_example.rb → memory/08_custom_logger_demo.rb} +17 -14
- data/examples/{07_error_handling_scenarios.rb → memory/09_error_handling_demo.rb} +4 -4
- data/examples/{08_entity_addressing_basic.rb → memory/10_entity_addressing_basic.rb} +8 -8
- data/examples/{08_entity_addressing_with_filtering.rb → memory/11_entity_addressing_with_filtering.rb} +6 -6
- data/examples/{09_regex_filtering_microservices.rb → memory/12_regex_filtering_microservices.rb} +2 -2
- data/examples/{10_header_block_configuration.rb → memory/13_header_block_configuration.rb} +6 -6
- data/examples/{11_global_configuration_example.rb → memory/14_global_configuration_demo.rb} +19 -8
- data/examples/{show_logger.rb → memory/15_logger_demo.rb} +1 -1
- data/examples/memory/README.md +163 -0
- data/examples/memory/memory_transport_architecture.svg +90 -0
- data/examples/memory/point_to_point_pattern.svg +94 -0
- data/examples/memory/publish_subscribe_pattern.svg +125 -0
- data/examples/{04_redis_smart_home_iot.rb → redis/01_smart_home_iot_demo.rb} +5 -5
- data/examples/redis/README.md +230 -0
- data/examples/redis/alert_system_flow.svg +127 -0
- data/examples/redis/dashboard_status_flow.svg +107 -0
- data/examples/redis/device_command_flow.svg +113 -0
- data/examples/redis/redis_transport_architecture.svg +115 -0
- data/examples/{smart_home_iot_dataflow.md → redis/smart_home_iot_dataflow.md} +4 -116
- data/examples/redis/smart_home_system_architecture.svg +133 -0
- data/examples/redis_enhanced/README.md +319 -0
- data/examples/redis_enhanced/enhanced_01_basic_patterns.rb +233 -0
- data/examples/redis_enhanced/enhanced_02_fluent_api.rb +331 -0
- data/examples/redis_enhanced/enhanced_03_dual_publishing.rb +281 -0
- data/examples/redis_enhanced/enhanced_04_advanced_routing.rb +419 -0
- data/examples/redis_queue/01_basic_messaging.rb +221 -0
- data/examples/redis_queue/01_comprehensive_examples.rb +508 -0
- data/examples/redis_queue/02_pattern_routing.rb +405 -0
- data/examples/redis_queue/03_fluent_api.rb +422 -0
- data/examples/redis_queue/04_load_balancing.rb +486 -0
- data/examples/redis_queue/05_microservices.rb +735 -0
- data/examples/redis_queue/06_emergency_alerts.rb +777 -0
- data/examples/redis_queue/07_queue_management.rb +587 -0
- data/examples/redis_queue/README.md +366 -0
- data/examples/redis_queue/enhanced_01_basic_patterns.rb +233 -0
- data/examples/redis_queue/enhanced_02_fluent_api.rb +331 -0
- data/examples/redis_queue/enhanced_03_dual_publishing.rb +281 -0
- data/examples/redis_queue/enhanced_04_advanced_routing.rb +419 -0
- data/examples/redis_queue/redis_queue_architecture.svg +148 -0
- data/ideas/README.md +41 -0
- data/ideas/agents.md +1001 -0
- data/ideas/database_transport.md +980 -0
- data/ideas/improvement.md +359 -0
- data/ideas/meshage.md +1788 -0
- data/ideas/message_discovery.md +178 -0
- data/ideas/message_schema.md +1381 -0
- data/lib/smart_message/.idea/.gitignore +8 -0
- data/lib/smart_message/.idea/markdown.xml +6 -0
- data/lib/smart_message/.idea/misc.xml +4 -0
- data/lib/smart_message/.idea/modules.xml +8 -0
- data/lib/smart_message/.idea/smart_message.iml +16 -0
- data/lib/smart_message/.idea/vcs.xml +6 -0
- data/lib/smart_message/addressing.rb +15 -0
- data/lib/smart_message/base.rb +0 -2
- data/lib/smart_message/configuration.rb +1 -1
- data/lib/smart_message/logger.rb +15 -4
- data/lib/smart_message/plugins.rb +5 -2
- data/lib/smart_message/serializer.rb +14 -0
- data/lib/smart_message/transport/redis_enhanced_transport.rb +399 -0
- data/lib/smart_message/transport/redis_queue_transport.rb +555 -0
- data/lib/smart_message/transport/registry.rb +1 -0
- data/lib/smart_message/transport.rb +34 -1
- data/lib/smart_message/version.rb +1 -1
- data/lib/smart_message.rb +5 -52
- data/mkdocs.yml +184 -0
- data/p2p_plan.md +326 -0
- data/p2p_roadmap.md +287 -0
- data/smart_message.gemspec +2 -0
- data/smart_message.svg +51 -0
- metadata +170 -44
- data/docs/README.md +0 -57
- data/examples/dead_letters.jsonl +0 -12
- data/examples/temp.txt +0 -94
- data/examples/tmux_chat/README.md +0 -283
- data/examples/tmux_chat/bot_agent.rb +0 -278
- data/examples/tmux_chat/human_agent.rb +0 -199
- data/examples/tmux_chat/room_monitor.rb +0 -160
- data/examples/tmux_chat/shared_chat_system.rb +0 -328
- data/examples/tmux_chat/start_chat_demo.sh +0 -190
- data/examples/tmux_chat/stop_chat_demo.sh +0 -22
- /data/docs/{properties.md → core-concepts/properties.md} +0 -0
- /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>
|