zoukankan      html  css  js  c++  java
  • nginx禁止对写操作timeout时retry

    1) nginx禁止对写操作timeout时retry

    以前遇到的一个case,业务那边说一笔请求从nginx端发送给后端tomcat了2次(落在两个不同的tomcat节点上)。
    后来发现是nginx发给后端节点timeout,然后做了重试,发给了另一个节点。
    默认情况下nginx对后端error和 timeout 都会做retry,可以明确的禁止在timeout的情况下禁止retry。
    当然如果集群读写分离的话,对于只读集群retry是无所谓的,但对于写确实存在问题。

    2) kafka重启时因为数据日志文件名被人重命名过而导致启动失败

    启动kafka broker的时候,会重新load之前的每个topic的数据,正常情况下会提示每个topic恢复完成。

    INFO Recovering unflushed segment 588022 in log xxx-topic-0. (kafka.log.Log)
    INFO Completed load of log xxx-topic-0 with log end offset 590676 (kafka.log.Log)

    但当有些topic下的数据恢复失败的时候,会导致broker关闭,异常如下

    ERROR There was an error in one of the threads during logs loading: java.lang.NumberFormatException: For input string: "test" (kafka.log.LogManager)
    FATAL [Kafka Server 3], Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
    
    java.lang.NumberFormatException: For input string: "test"
          at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
          at java.lang.Long.parseLong(Long.java:589)
          at java.lang.Long.parseLong(Long.java:631)
          at scala.collection.immutable.StringLike$class.toLong(StringLike.scala:251)
          at scala.collection.immutable.StringOps.toLong(StringOps.scala:30)
          at kafka.log.Log$$anonfun$loadSegments$4.apply(Log.scala:152)
          at kafka.log.Log$$anonfun$loadSegments$4.apply(Log.scala:141)
          at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:778)
          at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
          at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
          at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:777)
          at kafka.log.Log.loadSegments(Log.scala:141)
          at kafka.log.Log.<init>(Log.scala:67)
          at kafka.log.LogManager$$anonfun$loadLogs$2$$anonfun$3$$anonfun$apply$7$$anonfun$apply$1.apply$mcV$sp(LogManager.scala:142)
          at kafka.utils.Utils$$anon$1.run(Utils.scala:54)
          at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
          at java.util.concurrent.FutureTask.run(FutureTask.java:266)
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
          at java.lang.Thread.run(Thread.java:745)

    这是因为某个目录下,存在一个 test.log 的文件

    $ ls mytopic-0/
    00000000000000000485.index  00000000000000000485.log  00000000000000000568.index  00000000000000000568.log  test.log

    看上去这个 test.log 当时是把 00…log 给拷贝了一个,然后用编辑器去查看内容。而事后忘了清理掉,导致重启时把这个文件当成一个畸形文件了。因为kafka broker要求所有数据文件名称都是Long类型的。

    3) 又一个actor阻塞的例子

    在我自己的mac上测试的时候,一切正常,部署到dev环境就严重超时。
    jstack观察发现又是误用阻塞操作导致所有actor的线程都被阻塞所致,当时 EventProcessor 这个 Router 背后的实例数设置的是40,而这台dev环境的linux只有2核,根据当时akka的配置里的并发因子算出并发线程数是32,
    所以32个线程基本都被 eventProcessor 的40个actor全给占用了,因为它是不断发消息轮询的(我的mac是8核,运行时的线程数要大于40不会发生全部被阻塞的情况)。
    解决方式,一方面调大并发因子,把线程数提升上去,另一方面控制 eventProcessor 的实例数,不让它的阻塞操作影响到其他actor。(其实根上是没设计好,没有隔离阻塞操作,只不过这正好是个小应用,不需要过多考虑。)

    http://hongjiang.info/untitled-2/

  • 相关阅读:
    ajax怎么打开新窗口具体如何实现
    关于springcloud hystrix 执行 hystrix.stream 跳转失败的问题
    Zookeeper 和Eureka比较
    Maven Install报错:Perhaps you are running on a JRE rather than a JDK?
    Oracle11g卸载步骤
    Oracle数据库备份及恢复
    python是如何进行内存管理的?
    python面试题
    json模块与hashlib模块的使用
    随机验证码、打印进度条、文件copy脚本
  • 原文地址:https://www.cnblogs.com/softidea/p/9724747.html
Copyright © 2011-2022 走看看