我正在负载测试一个用Quarkus开发的简单应用程序。应用程序将http请求代理到另一个http服务。应用程序使用org.eclipse.microprofile.reactive.messaging。Emitter和org.eclipse.microprofile.reactive.messaging.Channel.
如果我将请求速率推到300 req/sec,我将获得低于错误。我试图理解错误SRMSG00034:发出项目的下游请求不足以及如何解决它。如有任何帮助,不胜感激。
2021-03-10 06:43:47,678 ERROR [io.qua.ver.htt.run.QuarkusErrorHandler] (executor-thread-100) HTTP Request to /events failed, error id: cb6577a7-0cd6-4790-a5ea-5ccd73a088fc-289: java.lang.IllegalStateException: SRMSG00034: Insufficient downstream requests to emit item
at io.smallrye.reactive.messaging.extension.ThrowingEmitter.emit(ThrowingEmitter.java:60)
at io.smallrye.reactive.messaging.extension.AbstractEmitter.emit(AbstractEmitter.java:146)
at io.smallrye.reactive.messaging.extension.EmitterImpl.send(EmitterImpl.java:29)
所以,您正在使用发射器将消息推送到某处。发射器是一个异步结构,它有一个默认缓冲区来处理缓慢的消耗(参见https://quarkus.io/blog/reactive-messaging-emitter/)。在您的情况下,某处的不够快或缓冲区不够大。
有几种方法可以解决这个问题:
- 你可以改变发射器本身的溢出策略,例如,扩展缓冲区,甚至使用无界缓冲区,如果它在你的情况下是安全的
- 你检查为什么消耗限制在300条消息/秒,这是相当低的