spring-重试:长时间等待安全吗? (半小时等)
spring-retry: is it safe to wait for long periods? (half hour, etc.)
我有一个网络应用程序,我在其中使用 spring-amqp
来侦听 rabbitmq
中的消息,并通过以下设置启用重试:
spring:
rabbitmq:
listener:
simple:
retry:
enabled: true
multiplier: 2
initial-interval: 15m
max-interval: 1h
其中 org.springframework.retry.backoff.Sleeper
最常用的实现基于 Thread.sleep
,其中 - AFAIK - 锁定当前线程?
我发现并发 amqp
侦听器计数默认为 1,即使我将其更改为 10;线程池会长时间丢失一个线程。
使用 spring-retry
长时间等待是否安全,就长时间阻塞侦听器线程池中的线程而言?
这是个案问题,或者最好不要使用长间隔以避免线程阻塞?
这实际上取决于您的应用程序以及导致重试的原因。例如,如果数据库不可用,那么很可能所有线程都会重试。
但是,如果某些类型的消息可能成功,而其他类型的消息则处于这些漫长的等待中,那么您的设计可能需要重新审视并为两种消息类型使用不同的 queues/listener 容器。
它不会真的 "hurt" 任何东西,但我真的不喜欢将消息长时间处于未确认状态。在解决下游问题之前 stop()
侦听器容器可能会更好。
我有一个网络应用程序,我在其中使用 spring-amqp
来侦听 rabbitmq
中的消息,并通过以下设置启用重试:
spring:
rabbitmq:
listener:
simple:
retry:
enabled: true
multiplier: 2
initial-interval: 15m
max-interval: 1h
其中 org.springframework.retry.backoff.Sleeper
最常用的实现基于 Thread.sleep
,其中 - AFAIK - 锁定当前线程?
我发现并发 amqp
侦听器计数默认为 1,即使我将其更改为 10;线程池会长时间丢失一个线程。
使用 spring-retry
长时间等待是否安全,就长时间阻塞侦听器线程池中的线程而言?
这是个案问题,或者最好不要使用长间隔以避免线程阻塞?
这实际上取决于您的应用程序以及导致重试的原因。例如,如果数据库不可用,那么很可能所有线程都会重试。
但是,如果某些类型的消息可能成功,而其他类型的消息则处于这些漫长的等待中,那么您的设计可能需要重新审视并为两种消息类型使用不同的 queues/listener 容器。
它不会真的 "hurt" 任何东西,但我真的不喜欢将消息长时间处于未确认状态。在解决下游问题之前 stop()
侦听器容器可能会更好。