RabbitMQ Architecture
RabbitMQ Architecture
Info
The eIsland backend uses RabbitMQ 3.12+ for asynchronous processing and event-driven architecture. The application connects via Spring AMQP (spring-boot-starter-amqp) with Jackson JSON message serialization. There are 6 exchanges, 21 queues, and 9 message types across 6 business domains. Every domain follows the same 3-queue retry pattern: main queue โ retry queue (TTL-delayed via DLX) โ DLQ. For the MySQL DLQ tables, see MySQL Database Schema. For the Redis caches, see Redis Architecture.
Architecture Overview
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ eIsland RabbitMQ Layer โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ Client: Spring AMQP (spring-boot-starter-amqp) โ
โ Serializer: JacksonJsonMessageConverter (JSON) โ
โ Exchanges: 6 DirectExchange (all durable) โ
โ Queues: 21 (all durable) โ
โ Messages: 9 Java record types โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 6 Message Domains โ โ
โ โ โ โ
โ โ Auth โ Email verification code dispatch โ โ
โ โ Payment โ Payment notification processing + receipt dispatch โ โ
โ โ Agent โ Billing deduction + usage stats โ โ
โ โ Upload โ Object replication (outbox pattern) โ โ
โ โ Identity โ Identity verification material upload โ โ
โ โ Mini Game โ Score upsert โ โ
โ โ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ Retry Pattern (all domains): โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ Main โโโโโบโ Retry โโโโโบโ DLQ โ โ
โ โ Queue โโโโโโ Queue โ โ Queue โ โ
โ โ โ โ (TTL+DLX)โ โ (persist)โ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโExchange Topology
Tips
All 6 exchanges are DirectExchange type with durable=true and autoDelete=false. Direct exchanges route messages to queues based on exact routing key match.
| Exchange Name | Domain | Queues | Config Class |
|---|---|---|---|
eisland.email.verify.exchange | Auth โ Email Verification | 3 | EmailVerificationMqConfig |
eisland.payment.notify.exchange | Payment โ Notifications & Receipts | 6 | PaymentMqConfig |
eisland.agent.billing.exchange | Agent โ Billing & Usage | 4 | AgentBillingMqConfig |
eisland.object.replication.exchange | Upload โ Object Replication | 3 | ObjectReplicationMqConfig |
eisland.identity.material.exchange | Identity โ Material Upload | 3 | IdentityMaterialMqConfig |
eisland.mini-game.exchange | Mini Game โ Score Upsert | 3 | MiniGameScoreMqConfig |
Retry Pattern
Info
All domains (except agent.usage-stats) follow the same application-level retry pattern. Unlike Spring Retry or RabbitMQ's built-in retry, this pattern uses explicit routing to retry and DLQ queues with custom retry headers for fine-grained control.
Flow Diagram
Producer
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Main Queue โ
โ @RabbitListener โ onMessage(msg, retryCount) โ
โ โ โ
โ โโโ Success โ ACK (message consumed) โ
โ โ โ
โ โโโ Exception caught: โ
โ โ โ
โ โโโ retryCount < maxRetries โ
โ โ โ convertAndSend to RETRY routing key โ
โ โ โ header: x-{domain}-retry-count + 1 โ
โ โ โ
โ โโโ retryCount >= maxRetries โ
โ โ convertAndSend to DLQ routing key โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Retry Queue โ
โ Arguments: โ
โ x-message-ttl: {delay}ms โ
โ x-dead-letter-exchange: {same exchange} โ
โ x-dead-letter-routing-key: {main routing key} โ
โ โ
โ Message expires after TTL โ re-routed to Main Queue โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ (if maxRetries exhausted)
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ DLQ Queue โ
โ @RabbitListener โ onDeadLetter(msg, retryCount) โ
โ โ Log error โ
โ โ Persist to *_dlq_log MySQL table โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโRetry Configuration Summary
| Domain | Retry TTL | Max Retries | Retry Header | Configurable Via |
|---|---|---|---|---|
| Email Verify | 10,000ms | 3 | x-email-retry-count | ${email.notify-retry-delay-ms}, ${email.notify-max-retries} |
| Identity Material | 10,000ms | 3 | x-identity-material-retry-count | Hardcoded |
| Object Replication | 15,000ms | 6 | x-object-replication-retry-count | ${object-replication.retry-delay-ms}, ${object-replication.max-retries} |
| Payment Notify | 15,000ms | 5 | x-payment-retry-count | ${payment.notify-retry-delay-ms}, ${payment.notify-max-retries} |
| Payment Receipt | 15,000ms | 5 | x-payment-receipt-retry-count | ${payment.notify-retry-delay-ms}, ${payment.notify-max-retries} |
| Agent Billing | 5,000ms | 5 | x-agent-billing-retry-count | Hardcoded |
| Mini Game Score | 15,000ms | 5 | x-mini-game-score-retry-count | Hardcoded |
| Agent Usage Stats | โ | โ | โ | No retry (fire-and-forget) |
Domain 1: Email Verification
Info
Dispatches verification code emails asynchronously. The producer publishes to the main queue, and the consumer calls the Resend API to deliver the email. Failed deliveries are retried with exponential backoff via the retry queue.
Queue Topology
| Queue | Routing Key | Arguments |
|---|---|---|
eisland.email.verify.dispatch.queue | eisland.email.verify.dispatch | โ |
eisland.email.verify.retry.queue | eisland.email.verify.retry | x-message-ttl: 10000ms, x-dead-letter-exchange: eisland.email.verify.exchange, x-dead-letter-routing-key: eisland.email.verify.dispatch |
eisland.email.verify.dlq | eisland.email.verify.dlq | โ |
Message: EmailCodeDispatchMessage
public record EmailCodeDispatchMessage(
String traceId, // Distributed trace ID for request correlation
String email, // Recipient email address
String scene, // Email scene: REGISTER, LOGIN, RESET_PASSWORD, CHANGE_EMAIL, UNREGISTER
String code, // Plaintext verification code (6 digits)
long createdAtEpochSeconds, // Message creation time (epoch seconds)
String lastError // Error message from previous failed attempt (null on first send)
)Producer โ Consumer Flow
| Step | Component | Action |
|---|---|---|
| 1 | EmailVerificationService.sendCode() | Generates code, hashes for Redis, publishes EmailCodeDispatchMessage to main queue |
| 2 | EmailCodeDispatchConsumer.onMessage() | Calls Resend API to send email. On failure โ retry or DLQ |
| 3 | EmailCodeDispatchConsumer.onDeadLetter() | Persists to email_dispatch_dlq_log table |
Domain 2: Payment Notification
Warning
Payment notifications from Alipay and WeChat are published to MQ immediately after signature verification. This decouples the HTTP callback response from the business logic (order update, benefit granting), ensuring the payment gateway receives a fast 200 OK even if downstream processing is slow.
Queue Topology
| Queue | Routing Key | Arguments |
|---|---|---|
eisland.payment.notify.process.queue | eisland.payment.notify.process | โ |
eisland.payment.notify.retry.queue | eisland.payment.notify.retry | x-message-ttl: 15000ms, x-dead-letter-exchange: eisland.payment.notify.exchange, x-dead-letter-routing-key: eisland.payment.notify.process |
eisland.payment.notify.dlq | eisland.payment.notify.dlq | โ |
eisland.payment.receipt.dispatch.queue | eisland.payment.receipt.dispatch | โ |
eisland.payment.receipt.retry.queue | eisland.payment.receipt.retry | x-message-ttl: 15000ms, x-dead-letter-exchange: eisland.payment.notify.exchange, x-dead-letter-routing-key: eisland.payment.receipt.dispatch |
eisland.payment.receipt.dlq | eisland.payment.receipt.dlq | โ |
Message: PaymentNotifyMessage
public record PaymentNotifyMessage(
String notifyId, // Gateway notification ID (for deduplication)
String channel, // Payment channel: ALIPAY, WECHAT
String outTradeNo, // Merchant order number
String transactionId, // Gateway transaction ID
String tradeState, // Trade state: SUCCESS, REFUND, NOTPAY, CLOSED, etc.
OffsetDateTime successTime, // Payment success time from gateway
boolean verifyOk, // Whether RSA2 signature verification passed
String rawBody, // Complete raw callback payload (for audit)
String lastError // Error from previous failed attempt
)Message: PaymentReceiptDispatchMessage
public record PaymentReceiptDispatchMessage(
String traceId, // Distributed trace ID
String email, // Recipient email for receipt
String outTradeNo, // Merchant order number
String channel, // Payment channel: ALIPAY, WECHAT
String transactionId, // Gateway transaction ID
Integer amountFen, // Payment amount in fen
String currency, // Currency code: CNY
String productCode, // Product: pro-month, agent-recharge
LocalDateTime paidAt, // Payment time
LocalDateTime expireAt, // Order expiration time
String lastError // Error from previous failed attempt
)Producer โ Consumer Flow
| Step | Component | Action |
|---|---|---|
| 1 | AlipayNotifyController / WechatPayNotifyController | Verifies signature, publishes PaymentNotifyMessage |
| 2 | PaymentNotifyConsumer.onMessage() | Idempotent processing: update order status, grant benefits, send receipt |
| 3 | PaymentNotifyConsumer.onDeadLetter() | Persists to payment_dlq_log table |
| 4 | PaymentService.trySendPaymentReceipt() | After order completion, publishes PaymentReceiptDispatchMessage |
| 5 | PaymentReceiptDispatchConsumer.onMessage() | Calls Resend API to send receipt email |
| 6 | PaymentReceiptDispatchConsumer.onDeadLetter() | Persists to payment_dlq_log table |
Domain 3: Agent Billing
Caution
The agent billing domain has two queues: one for balance deduction persistence (critical, with retry) and one for usage stats aggregation (fire-and-forget, no retry). The deduction queue has the shortest retry TTL (5 seconds) to minimize billing delay. For the Redis atomic deduction, see Redis โ Agent Balance. For the MySQL tables, see Agent Domain.
Queue Topology
| Queue | Routing Key | Arguments |
|---|---|---|
eisland.agent.billing.deduct.queue | eisland.agent.billing.deduct | โ |
eisland.agent.billing.deduct.retry.queue | eisland.agent.billing.deduct.retry | x-message-ttl: 5000ms, x-dead-letter-exchange: eisland.agent.billing.exchange, x-dead-letter-routing-key: eisland.agent.billing.deduct |
eisland.agent.billing.deduct.dlq | eisland.agent.billing.deduct.dlq | โ |
eisland.agent.usage-stats.queue | eisland.agent.usage-stats | โ (no retry, no DLQ) |
Message: AgentBillingDeductMessage
public record AgentBillingDeductMessage(
String username, // Username whose balance was deducted
String amountFen, // Deducted amount in fen (decimal string, 8 places)
String modelName, // AI model name: deepseek-chat, mimo-v2-pro, etc.
int inputTokens, // Input tokens consumed
int outputTokens, // Output tokens generated
String lastError // Error from previous failed attempt
)Message: AgentUsageStatsMessage
public record AgentUsageStatsMessage(
String modelName, // AI model name
int inputTokens, // Input tokens (fresh, not cached)
int cachedTokens, // Cached input tokens
int outputTokens, // Output tokens
int reasoningTokens, // Reasoning/thinking tokens
long costMicroFen // Cost in micro-fen (1 micro-fen = 0.00000001 fen)
)Producer โ Consumer Flow
| Step | Component | Action |
|---|---|---|
| 1 | AgentBalanceRedisService.deduct() | Lua script deducts balance in Redis, publishes AgentBillingDeductMessage |
| 2 | AgentBillingDeductConsumer.onMessage() | Persists deduction to user_account.balance_fen in MySQL |
| 3 | AgentBillingDeductConsumer.onDeadLetter() | Persists to agent_billing_dlq_log table |
| 4 | AgentModelPricingService.recordUsageStats() | Publishes AgentUsageStatsMessage after each billing |
| 5 | AgentUsageStatsConsumer.onMessage() | Upserts delta to agent_usage_stats table. Failures are logged only (no retry) |
Domain 4: Object Replication
Info
Implements the outbox pattern for reliable cross-provider file replication (e.g., R2 โ OSS). Database writes create outbox events; a relay service polls the outbox table and publishes replication tasks to MQ. The main queue supports priority (0โ10) via x-max-priority, ensuring high-priority replications (e.g., user avatars) are processed before low-priority ones (e.g., wallpapers).
Queue Topology
| Queue | Routing Key | Arguments |
|---|---|---|
eisland.object.replication.process.queue | eisland.object.replication.process | x-max-priority: 10 |
eisland.object.replication.retry.queue | eisland.object.replication.retry | x-message-ttl: 15000ms, x-dead-letter-exchange: eisland.object.replication.exchange, x-dead-letter-routing-key: eisland.object.replication.process |
eisland.object.replication.dlq | eisland.object.replication.dlq | โ |
Message: ObjectReplicationMessage
public record ObjectReplicationMessage(
Long taskId, // FK to object_replication_task.id
String traceId, // Distributed trace ID
String lastError // Error from previous failed attempt
) implements SerializableOutbox Pattern Flow
1. Service writes file โ creates object_outbox row (status=pending)
โ
2. ObjectOutboxRelayService โ (polls every 3s, batch=100)
reads outbox rows โโโโโโโโโโ
โ
โโโ Creates object_replication_task row
โโโ Publishes ObjectReplicationMessage to main queue
โโโ Marks outbox row as published
โ
3. ObjectReplicationConsumer.onMessage()
โ
โโโ Downloads file from source provider
โโโ Uploads to target provider
โโโ Updates task status to done
โโโ Updates business entity URL field
โ
4. On failure โ retry queue (15s TTL) โ main queue (up to 6 retries)
โ
5. On DLQ โ ObjectReplicationConsumer.onDeadLetter()
โโโ Persists to object_replication_log tableProducer โ Consumer Flow
| Step | Component | Action |
|---|---|---|
| 1 | ObjectOutboxRelayService | Polls object_outbox, creates object_replication_task, publishes ObjectReplicationMessage with priority |
| 2 | ObjectReplicationConsumer.onMessage() | Downloads from source, uploads to target, updates task and business entity |
| 3 | ObjectReplicationConsumer.onDeadLetter() | Persists to object_replication_log table |
Domain 5: Identity Verification Material
Warning
After Alipay identity verification completes, face material info (encrypted) must be uploaded to object storage for audit compliance. This is done asynchronously via MQ to avoid blocking the verification response.
Queue Topology
| Queue | Routing Key | Arguments |
|---|---|---|
eisland.identity.material.upload.queue | eisland.identity.material.upload | โ |
eisland.identity.material.upload.retry.queue | eisland.identity.material.upload.retry | x-message-ttl: 10000ms, x-dead-letter-exchange: eisland.identity.material.exchange, x-dead-letter-routing-key: eisland.identity.material.upload |
eisland.identity.material.upload.dlq | eisland.identity.material.upload.dlq | โ |
Message: IdentityMaterialMessage
public record IdentityMaterialMessage(
String username, // Username who completed verification
String certifyId, // Alipay certification ID
String materialInfo, // Encrypted material info JSON from Alipay
String lastError // Error from previous failed attempt
)Producer โ Consumer Flow
| Step | Component | Action |
|---|---|---|
| 1 | IdentityVerificationService.queryResult() | After Alipay returns PASSED, publishes IdentityMaterialMessage |
| 2 | IdentityMaterialUploadConsumer.onMessage() | Uploads material JSON to COS/OSS object storage, updates identity_verification.material_info_url |
| 3 | IdentityMaterialUploadConsumer.onDeadLetter() | Logs error (no dedicated DLQ log table) |
Domain 6: Mini Game Score
Info
Game score submissions are processed asynchronously to ensure the HTTP response is fast. The consumer performs Redis idempotency check, distributed lock, MySQL upsert, and leaderboard cache sync in sequence.
Queue Topology
| Queue | Routing Key | Arguments |
|---|---|---|
eisland.mini-game.score.upsert.queue | eisland.mini-game.score.upsert | โ |
eisland.mini-game.score.upsert.retry.queue | eisland.mini-game.score.upsert.retry | x-message-ttl: 15000ms, x-dead-letter-exchange: eisland.mini-game.exchange, x-dead-letter-routing-key: eisland.mini-game.score.upsert |
eisland.mini-game.score.upsert.dlq | eisland.mini-game.score.upsert.dlq | โ |
Message: ScoreUpsertMessage
public record ScoreUpsertMessage(
String submitId, // Client-generated unique ID for idempotency
Long userId, // FK to user_account.id
String gameId, // Game identifier: 2048, tetris, snake
long score, // Submitted score value
long durationMs, // Game duration in milliseconds
int moves, // Number of moves made
long achievedAt, // Timestamp when the score was achieved
String clientVersion, // Client app version (for anti-cheat)
String traceId, // Distributed trace ID
String lastError // Error from previous failed attempt
)Producer โ Consumer Flow
| Step | Component | Action |
|---|---|---|
| 1 | ScoreUpsertProducer.publish() | After rate-limit and sanity checks, publishes ScoreUpsertMessage |
| 2 | ScoreUpsertConsumer.onMessage() | Redis SETNX idempotency โ distributed lock โ MySQL upsert โ leaderboard cache sync |
| 3 | ScoreUpsertConsumer.onDeadLetter() | Persists to mini_game_score_dlq_log table |
Queue Summary
| # | Queue Name | Domain | Retry? | DLQ? |
|---|---|---|---|---|
| 1 | eisland.email.verify.dispatch.queue | Auth | โ | โ |
| 2 | eisland.email.verify.retry.queue | Auth | โ | โ |
| 3 | eisland.email.verify.dlq | Auth | โ | โ |
| 4 | eisland.payment.notify.process.queue | Payment | โ | โ |
| 5 | eisland.payment.notify.retry.queue | Payment | โ | โ |
| 6 | eisland.payment.notify.dlq | Payment | โ | โ |
| 7 | eisland.payment.receipt.dispatch.queue | Payment | โ | โ |
| 8 | eisland.payment.receipt.retry.queue | Payment | โ | โ |
| 9 | eisland.payment.receipt.dlq | Payment | โ | โ |
| 10 | eisland.agent.billing.deduct.queue | Agent | โ | โ |
| 11 | eisland.agent.billing.deduct.retry.queue | Agent | โ | โ |
| 12 | eisland.agent.billing.deduct.dlq | Agent | โ | โ |
| 13 | eisland.agent.usage-stats.queue | Agent | โ | โ |
| 14 | eisland.object.replication.process.queue | Upload | โ | โ |
| 15 | eisland.object.replication.retry.queue | Upload | โ | โ |
| 16 | eisland.object.replication.dlq | Upload | โ | โ |
| 17 | eisland.identity.material.upload.queue | Identity | โ | โ |
| 18 | eisland.identity.material.upload.retry.queue | Identity | โ | โ |
| 19 | eisland.identity.material.upload.dlq | Identity | โ | โ |
| 20 | eisland.mini-game.score.upsert.queue | Mini Game | โ | โ |
| 21 | eisland.mini-game.score.upsert.retry.queue | Mini Game | โ | โ |
| 22 | eisland.mini-game.score.upsert.dlq | Mini Game | โ | โ |
DLQ Persistence
Warning
When a message reaches the DLQ (max retries exhausted), the consumer persists the failure details to a MySQL table for manual investigation and potential replay. See the corresponding table definitions in MySQL Database Schema.
| Domain | DLQ Log Table | Entity Class | Consumer |
|---|---|---|---|
| Email Verify | email_dispatch_dlq_log | EmailDispatchDlqLog | EmailCodeDispatchConsumer.onDeadLetter() |
| Payment Notify | payment_dlq_log | PaymentDlqLog | PaymentNotifyConsumer.onDeadLetter() |
| Payment Receipt | payment_dlq_log | PaymentDlqLog | PaymentReceiptDispatchConsumer.onDeadLetter() |
| Agent Billing | agent_billing_dlq_log | AgentBillingDlqLog | AgentBillingDeductConsumer.onDeadLetter() |
| Object Replication | object_replication_log | โ | ObjectReplicationConsumer.onDeadLetter() |
| Mini Game Score | mini_game_score_dlq_log | MiniGameScoreDlqLog | ScoreUpsertConsumer.onDeadLetter() |
| Identity Material | โ | โ | IdentityMaterialUploadConsumer.onDeadLetter() (log only) |
Global Configuration
RabbitMQ Connection
spring:
rabbitmq:
host: ${RABBITMQ_HOST}
port: ${RABBITMQ_PORT}
username: ${RABBITMQ_USERNAME}
password: ${RABBITMQ_PASSWORD}
listener:
simple:
default-requeue-rejected: true # Safety net; all consumers handle errors explicitlyMessage Converter
Tips
JacksonJsonMessageConverter is configured as a singleton bean in EmailVerificationMqConfig and injected into the global RabbitTemplate. All Java record types are automatically serialized to/from JSON.
@Bean
public JacksonJsonMessageConverter jacksonJsonMessageConverter() {
return new JacksonJsonMessageConverter();
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,
JacksonJsonMessageConverter converter) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(converter);
return template;
}
@Bean
public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}Domain-Specific Properties
| Property | Default | Description |
|---|---|---|
email.notify-max-retries | 3 | Max retry attempts for email dispatch |
email.notify-retry-delay-ms | 10000 | Retry queue TTL for email (ms) |
payment.notify-max-retries | 5 | Max retry attempts for payment notifications |
payment.notify-retry-delay-ms | 15000 | Retry queue TTL for payment (ms) |
object-replication.enabled | true | Enable object replication subsystem |
object-replication.outbox-relay-enabled | true | Enable outbox relay polling |
object-replication.outbox-relay-batch-size | 100 | Outbox relay batch size per poll |
object-replication.outbox-relay-interval-ms | 3000 | Outbox relay poll interval (ms) |
object-replication.max-retries | 6 | Max retry attempts for replication |
object-replication.retry-delay-ms | 15000 | Retry queue TTL for replication (ms) |
object-replication.backfill-enabled | false | Enable backfill job for missed replications |
object-replication.backfill-batch-size | 200 | Backfill batch size |
object-replication.backfill-interval-ms | 5000 | Backfill poll interval (ms) |
object-replication.dlq-replay-enabled | false | Enable DLQ replay job |
object-replication.dlq-replay-batch-size | 100 | DLQ replay batch size |
object-replication.dlq-replay-interval-ms | 15000 | DLQ replay poll interval (ms) |
object-replication.source-fetch-timeout-ms | 60000 | Source file download timeout (ms) |
What RabbitMQ is NOT Used For
| Feature | Status | Alternative |
|---|---|---|
| Fanout / Topic exchanges | Not used | All exchanges are DirectExchange |
| RabbitMQ Streams | Not used | Classic queues only |
| Priority queues | Used in 1 queue only | object.replication.process.queue (x-max-priority: 10) |
| Message TTL on main queues | Not used | TTL only on retry queues |
| Max-length on queues | Not used | No backpressure at queue level |
| Custom container factories | Not used | All listeners use default SimpleRabbitListenerContainerFactory |
| Spring Retry / @Retryable | Not used | Hand-coded retry in consumer methods |
| RabbitMQ management plugin | Not configured in app | Managed externally |
Changelog
4f6b6-on

