我使用Kafka 0.10.1.1并使用自定义授权器。
从自定义授权程序中,我将微服务称为授权。它工作正常一段时间和星星在日志中抛出以下异常,整个群集变得没有响应。异常一直持续到我重新启动集群。但是,如果没有自定义授权器,整个群集在没有任何问题的情况下工作正常。 Kafka版本0.10.1.1中是否有任何错误或自定义授权程序有任何错误。
TRACE [ReplicaFetcherThread-0-39], Issuing to broker 1 of fetch request kafka.server.ReplicaFetcherThread$FetchRequest@8c63320 (kafka.server.ReplicaFetcherThread)
[2017-06-30 08:29:17,473] TRACE [ReplicaFetcherThread-2-1], Issuing to broker 1 of fetch request kafka.server.ReplicaFetcherThread$FetchRequest@67a143a (kafka.server.ReplicaFetcherThread)
[2017-06-30 08:29:17,473] WARN [ReplicaFetcherThread-3-1], Error in fetch kafka.server.ReplicaFetcherThread$FetchRequest@12d29e06 (kafka.server.ReplicaFetcherThread)
java.io.IOException: Connection to <HOST:PORT> (id: 1 rack: null) failed
at kafka.utils.NetworkClientBlockingOps$.awaitReady$1(NetworkClientBlockingOps.scala:83)
at kafka.utils.NetworkClientBlockingOps$.blockingReady$extension(NetworkClientBlockingOps.scala:93)
at kafka.server.ReplicaFetcherThread.sendRequest(ReplicaFetcherThread.scala:248)
at kafka.server.ReplicaFetcherThread.fetch(ReplicaFetcherThread.scala:238)
at kafka.server.ReplicaFetcherThread.fetch(ReplicaFetcherThread.scala:42)
at kafka.server.AbstractFetcherThread.processFetchRequest(AbstractFetcherThread.scala:118)
at kafka.server.AbstractFetcherThread.doWork(AbstractFetcherThread.scala:103)
at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:63)
我的自定义授权程序使用微服务检查授权并在番石榴缓存中缓存数据,到期时间为10分钟。
由于
答案 0 :(得分:1)
我建议使用线程转储来查看所有线程正在做什么。
这里只是一个猜测,因为没有太多信息可以继续。 如果您拥有单个缓存实例,那么可能发生的事情是,一旦缓存过期,所有请求都会开始访问微服务以获取授权信息,并且由于这会增加延迟,因此线程池会耗尽。线程转储可以告诉您有多少线程同时调用微服务。
如果这确实是问题,您可以考虑的一个选项是每个线程使用一个单独的缓存(使用Thread-local变量)。这样每个线程的缓存将在其自己的时间到期,并且不会导致其他线程在同一时间点击微服务。
另一种,更好的方法是IMO完全从授权代码路径中删除对微服务的阻塞调用。而不是直通缓存,通过从单独的后台线程更新缓存,使缓存始终保持最新。这样就不会在授权调用中添加延迟。