当前位置: 首页 > 知识库问答 >
问题:

断路器的非确定性行为

寿嘉悦
2023-03-14

我们对特使的电路断路进行的实验表明,结果并不确定。我们尝试使用如下设置故意跳闸电路,证明了这一点:

该服务是一个简单的Web服务器,它返回具有2秒时间延迟的200(该时间延迟确保服务器在异步请求之间保持忙碌)。我们特使Sidecar配置的快照显示,我们启用断路(超文本传输协议/1.1),最多1个连接和1个挂起的请求:

circuit_breakers:
   thresholds:
     - priority: "DEFAULT"
       max_connections: 1
       max_pending_requests: 1

接下来,我们通过向服务发送单个请求来测试这一点,它会像预期的那样可靠地响应200

但是,如果我们现在向服务发送2个异步请求,我们会看到意想不到的结果。它有时会为两个请求返回200,因为第二个请求会触发断路器,所以它不应该返回200。在其他情况下,一个请求返回一个200,另一个请求返回一个503服务不可用,这是我们期望发生的。尽管我们尽了最大努力,我们还是无法实现任何形式的可重复性,这让我们认为这与特使的底层并发有关。

当我们将max_connectionsmax_pending_requests改为较大的数字时(

我们希望理解这种缺乏绝对决定论的原因。非常感谢您的帮助!代码见回购协议

编辑:有一个问题详细描述了类似的意外行为,但我还没有找到一个索恩。

我提供了两个请求的日志,以演示输出:

  1. 同时发送3个请求,1个通过。
❯ (printf '%s\n' {1..3}) | xargs -I % -P 20 curl -v "http://localhost:3000?status=200&sleep=2"
**    Trying ::1...
  Trying ::1...
**  TCP_NODELAY set
TCP_NODELAY set
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 3000 (#0)
* Connected to localhost (::1) port 3000 (#0)
> GET /?status=200&sleep=2 HTTP/1.1
>>  GET /?status=200&sleep=2 HTTP/1.1
Host: localhost:3000
>>  Host: localhost:3000
User-Agent: curl/7.64.1
>>  User-Agent: curl/7.64.1
Accept: */*
>>  Accept: */*

>
* Connected to localhost (::1) port 3000 (#0)
> GET /?status=200&sleep=2 HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 503 Service Unavailable
< content-length: 81
< content-type: text/plain
< x-envoy-overloaded: true
< date: Wed, 12 Feb 2020 03:36:29 GMT
< server: envoy
<
* Connection #0 to host localhost left intact
upstream connect error or disconnect/reset before headers. reset reason: overflow* Closing connection 0
< HTTP/1.1 503 Service Unavailable
< content-length: 81
< content-type: text/plain
< x-envoy-overloaded: true
< date: Wed, 12 Feb 2020 03:36:29 GMT
< server: envoy
<
* Connection #0 to host localhost left intact
upstream connect error or disconnect/reset before headers. reset reason: overflow* Closing connection 0
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< content-length: 3
< server: envoy
< date: Wed, 12 Feb 2020 03:36:31 GMT
< x-envoy-upstream-service-time: 2007
<
* Connection #0 to host localhost left intact
200* Closing connection 0
❯ (printf '%s\n' {1..3}) | xargs -I % -P 20 curl -v "http://localhost:3000?status=200&sleep=2"
**    Trying ::1...
  Trying ::1...
**  TCP_NODELAY set
TCP_NODELAY set
* *  Trying ::1...
 *Connected to localhost (::1) port 3000 (#0)
*  TCP_NODELAY set
Connected to localhost (::1) port 3000 (#0)
> GET /?status=200&sleep=2 HTTP/1.1
> >Host: localhost:3000
 >GET /?status=200&sleep=2 HTTP/1.1
 User-Agent: curl/7.64.1
>>  Accept: */*
Host: localhost:3000
> >
 User-Agent: curl/7.64.1
> Accept: */*
>
* Connected to localhost (::1) port 3000 (#0)
> GET /?status=200&sleep=2 HTTP/1.1
> Host: localhost:3000
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< content-length: 3
< server: envoy
< date: Wed, 12 Feb 2020 03:40:50 GMT
< x-envoy-upstream-service-time: 2006
<
* Connection #0 to host localhost left intact
200* Closing connection 0
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< content-length: 3
< server: envoy
< date: Wed, 12 Feb 2020 03:40:52 GMT
< x-envoy-upstream-service-time: 4011
<
* Connection #0 to host localhost left intact
200* Closing connection 0
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< content-length: 3
< server: envoy
< date: Wed, 12 Feb 2020 03:40:54 GMT
< x-envoy-upstream-service-time: 6015
<
* Connection #0 to host localhost left intact
200* Closing connection 0

共有1个答案

东方和志
2023-03-14

下面是其中一位撰稿人:

断路器旨在防止过多负载通过系统传播,而不是强制执行严格限制。该系统的实现方式更简单、性能更高,但在某些情况下可能会稍微超出限制。以下是对断路器极限跟踪实施的评论

 类似资料:
  • 或者也许有更好的框架专门为这类场景设计? 谢了。

  • 在形式语言的乔姆斯基分类中,我需要一些非线性、无歧义和非确定性上下文自由语言(N-CFL)的例子? > 线性语言:线性语法是可能的(⊆ 例如 L1={anbn|n≥ 0 } 确定性上下文自由语言(D-CFG):可以使用确定性推下自动机(D-PDA),例如 L2={anbncm|n≥0,m≥0} L2是明确的。 非线性的CF语法是非线性的 Lnl={w:na(w)=nb(w)}也是一个非线性CFG。

  • 介绍 非确定性是一种通过仅定义问题来解决问题的算法。非确定性程序自动选择符合条件的选项。这项技术很适合逻辑编程。 例如,以下代码返回一对数,其和是一个质数。其中一个数从'(4 6 7)选取,另一个从'(5 8 11)选取。 (let ((i (amb 4 6 7)) (j (amb 5 8 11))) (if (prime? (+ i j)) (list i j)

  • 本文向大家介绍确定性和非确定性算法之间的差异,包括了确定性和非确定性算法之间的差异的使用技巧和注意事项,需要的朋友参考一下 在编程的上下文中,“算法”是依次执行一组明确定义的指令,以执行特定任务并获得所需的输出。在这里,我们说一组定义的指令,这意味着如果某个指令以预期的方式执行,那么某个地方的用户就会知道这些指令的结果。 根据有关指令结果的知识,有两种算法,即-确定性算法和非确定性算法。以下是两种

  • 程序设计语言让我们得以从烦冗的细节中脱身而出。Lisp 是一门优秀的语言,其原因在于它本身就帮我们处理如此之多的细枝末节,同时程序员对复杂问题的容忍是有限度的,而 Lisp 让程序员能从他们有限的耐受度中发掘出最大的潜力。 本章将会解说宏是怎么样帮助 Lisp 解决另一类重要的细节问题的:即,将非确定性算法转换为确定性算法的问题。 本章共分为五个部分。 第一部分 阐述了什么是非确定性。 第二部分

  • 我可以看到,我可以使用以下代码以编程方式将状态设置为强制打开:CircuitBreaker强制打开状态 但是有没有一种方法可以设置一个属性,在应用程序启动时立即将状态设置为此,以便可以与测试一起使用呢?