Nginx限速模块分为哪二种?按请求速率限速的burst和nodelay参数是什么意思?漏桶算法和令牌桶算法究竟有啥两样?本文将带您一研讨竟。我们会透过有些简便的言传身教呈现Nginx限速模块是如何工作的,然后结合代码讲解其幕后的算法和规律。

正文加入#醒来三下乡,青春筑梦行#举手投足,本人承诺,小说内容为原创,且未在此外平台发布过。

焦点算法

在追究Nginx限速模块之前,大家先来探望互联网传输中常用五个的流量控制算法:漏桶算法令牌桶算法。那四只“桶”到底有啥样异同呢?

一色一友一年轻

漏桶算法(leaky bucket)

漏桶算法(leaky
bucket)
算法思想如图所示:

统计 1

一个影象的演说是:

  • 水(请求)从下面倒入水桶,从水桶下方流出(被处理);
  • 不及流出的水存在水桶中(缓冲),以固定速率流出;
  • 水桶满后水溢出(丢弃)。

其一算法的主干是:缓存请求、匀速处理、多余的伸手直接屏弃。

透过一个月下乡实践,楚天荆英支农团的14位小伙伴们都是取得满满。每个人有了过多的率先次经历,在念书中成长,,相信那些月的履行对于大家十多个小伙伴来说相对三回难忘的经验。

令牌桶算法(token bucket)

令牌桶(token
bucket)
算法思想如图所示:

统计 2

算法思想是:

  • 令牌以固定速率暴发,并缓存到令牌桶中;
  • 令牌桶放满时,多余的令牌被甩掉;
  • 请求要花费等比例的令牌才能被处理;
  • 令牌不够时,请求被缓存。

相对而言漏桶算法,令牌桶算法不一致之处在于它不光有一只“桶”,还有个体系,那一个桶是用来存放令牌的,队列才是用来存放在请求的。

从功用上的话,漏桶和令牌桶算法最明显的分化就是是不是允许从天而降流量(burst)的处理,漏桶算法可以强行限制数量的实时传输(处理)速率,对突发流量不做额外处理;而令牌桶算法可以在限定数量的平均传输速率的还要允许某种程度的突发传输

Nginx按请求速率限速模块使用的是漏桶算法,即可以强行有限支撑请求的实时处理速度不会超越设置的阈值。

医保局 刘青云(医学院15护理)

Nginx限速模块

Nginx主要有二种限速措施:按连接数限速(ngx_http_limit_conn_module)、按请求速率限速(ngx_http_limit_req_module)。大家最首要讲解按请求速率限速。

自家以为人生来是为了贯彻价值和享用生活的,好多道理唯有大家亲身经历才会深有体会。要不忘初心,脚踏实地,常怀感恩之心。

按连接数限速

按连接数限速是指限制单个IP(或者其余的key)同时提倡的连接数,超出那些范围后,Nginx将一贯拒绝越多的连年。那一个模块的部署相比好通晓,详见ngx_http_limit_conn_module官方文档

不摔一跤就不会了解要怎么走,既要敢于困惑,也要学会相信;要学会通过体验把文化转化为智慧。

按请求速率限速

按请求速率限速是指限制单个IP(或者其它的key)发送请求的速率,超出指定速率后,Nginx将一直拒绝愈来愈多的呼吁。拔取leaky
bucket
算法达成。为深切领会那一个模块,我们先从实验现象说起。初阶以前大家先不难介绍一下该模块的布置形式,以上面的安插为例:

http {
    limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
    ...
    server {
        ...
        location /search/ {
            limit_req zone=mylimit burst=4 nodelay;
        }

使用limit_req_zone驷不及舌字,我们定义了一个名为mylimit大小为10MB的共享内存区域(zone),用来存放限速相关的计算音信,限速的key值为二进制的IP地址($binary_remote_addr),限速上限(rate)为2r/s;接着我们使用limit_req重点字将上述规则作用到/search/上。burstnodelay的成效稍后解释。

使用上述规则,对于/search/目录的走访,单个IP的访问速度被界定在了2请求/秒,当先那个界定的拜访将平素被Nginx拒绝。

多向领导提问,前提是由此自己思考还未缓解的;要善用寓目身边的人、事、物,思考并记录下来。

试验1——阿秒级计算

大家有如下配置:

...
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { 
    location / { 
        limit_req zone=mylimit;
    }
}
...

上述规则限制了各种IP访问的快慢为2r/s,并将该规则成效于跟目录。假使单个IP在越发短的流年内并发发送三个请求,结果会什么呢?

# 单个IP 10ms内并发发送6个请求
send 6 requests in parallel, time cost: 2 ms
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 200 OK
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 503 Service Temporarily Unavailable
end, total time cost: 461 ms

俺们利用单个IP在10ms内发并发送了6个请求,唯有1个成功,剩下的5个都被驳回。大家设置的进程是2r/s,为啥唯有1个成功吗,是否Nginx限制错了?当然不是,是因为Nginx的限流计算是基于阿秒的,大家设置的进程是2r/s,转换一下就是500ms内单个IP只同意通过1个请求,从501ms开始才同意通过首个请求。

统计 3

刘青云先生问候外祖父外婆的肉身

试行2——burst允许缓存处理突发请求

试验1大家见到,我们短期内发送了大气呼吁,Nginx根据微秒级精度计算,超出限制的呼吁直接拒绝。那在实质上情形中未免过于苛刻,真实互联网环境中呼吁到来不是匀速的,很可能有请求“突发”的情景,也就是“一股子一股子”的。Nginx考虑到了那种景色,可以因而burst最主要字开启对始料不及请求的缓存处理,而不是直接拒绝。

来看我们的布署:

...
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { 
    location / { 
        limit_req zone=mylimit burst=4;
    }
}
...

咱俩插手了burst=4,意思是各种key(此处是每个IP)最多允许4个突发请求的过来。若是单个IP在10ms内发送6个请求,结果会什么呢?

# 单个IP 10ms内发送6个请求,设置burst
send 6 requests in parallel, time cost: 2 ms
HTTP/1.1 200 OK
HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
end, total time cost: 2437 ms

对照实验1成功数增添了4个,这么些我们设置的burst数目是一样的。具体处理流程是:1个请求被当即处理,4个请求被置于burst队列里,其余一个伸手被拒绝。通过burst参数,大家使得Nginx限流具备了缓存处理突发流量的力量

不过请留意:burst的效益是让多余的呼吁可以先放到行列里,渐渐处理。尽管不加nodelay参数,队列里的伸手不会马上处理,而是根据rate设置的速度,以微秒级精确的快慢日益处理。

财政局经济办 王中媛(经管高校15营销)

试行3——nodelay下跌排队时间

试验2中大家看来,通过设置burst参数,咱们得以允许Nginx缓存处理肯定水平的突发,多余的请求可以先放到行列里,逐渐处理,那起到了平滑流量的作用。可是如果队列设置的可比大,请求排队的光阴就会相比长,用户角度看来就是RT变长了,那对用户很不团结。有如何解决办法呢?nodelay参数允许请求在排队的时候就霎时被拍卖,也就是说只要请求可以进入burst队列,就会立刻被后台worker处理,请留心,那意味着burst设置了nodelay时,系统眨眼之间间的QPS可能会超过rate设置的阈值。nodelay参数要跟burst一齐利用才有机能。

继承实验2的配置,大家进入nodelay选项:

...
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;
server { 
    location / { 
        limit_req zone=mylimit burst=4 nodelay;
    }
}
...

单个IP 10ms内并发发送6个请求,结果如下:

# 单个IP 10ms内发送6个请求
   实验3, 设置burst和nodelay       |  实验2, 只设置burst
send 6 requests, time cost: 4 ms |  time cost: 2 ms
HTTP/1.1 200 OK                  |  HTTP/1.1 200 OK
HTTP/1.1 200 OK                  |  HTTP/1.1 503 ...
HTTP/1.1 200 OK                  |  HTTP/1.1 200 OK
HTTP/1.1 200 OK                  |  HTTP/1.1 200 OK
HTTP/1.1 503 ...                 |  HTTP/1.1 200 OK
HTTP/1.1 200 OK                  |  HTTP/1.1 200 OK
total time cost: 465 ms          |  total time cost: 2437 ms

跟实验2对待,请求成功率没变化,不过总体耗时变短了。那怎么解释吗?实验2中,有4个请求被安置burst队列当中,工作进度每隔500ms(rate=2r/s)取一个请求举行处理,最终一个呼吁要排队2s才会被拍卖;实验3中,请求放入队列跟实验2是千篇一律的,但不一样的是,队列中的请求同时持有了被拍卖的身价,所以实验3中的5个请求可以算得同时开班被拍卖的,开销时间自然变短了。

而是请留意,尽管设置burst和nodelay可以下降突发请求的拍卖时间,不过长时间来看并不会增高吞吐量的上限,短时间吞吐量的上限是由rate决定的,因为nodelay只可以保障burst的哀求被随即处理,但Nginx会限制队列元素释放的进程,就像限制了令牌桶中令牌产生的快慢。

看看那里你可能会问,出席了nodelay参数之后的限速算法,到底算是哪一个“桶”,是漏桶算法仍然令牌桶算法?当然还算是漏桶算法。考虑一种状态,令牌桶算法的token为耗尽时会如何是好吗?由于它有一个呼吁队列,所以会把接下去的央浼缓存下来,缓存多少受限于队列大小。但这时缓存那几个请求还有意思呢?假如server已经过载,缓存队列越来越长,RT越来越高,固然过了很久请求被处理了,对用户来说也没怎么价值了。所以当token不够用时,最明智的做法就是一向拒绝用户的呼吁,那就成了漏桶算法,哈哈~

刚来第一天,学市场营销的自家被布署到了财政局的金谷会计企业实习。在这往日,我竟然不曾听过GPR-U8软件,再增进专业也不对口,感觉有点不太适应。不过思想来到一个新的小圈子,不就可以学到新技巧呢?专业≠就业。

源码剖析

经过地点的以身作则,我们队请求限速模块有了自然的认识,现在我们深深解析代码达成。按请求速率限流模块ngx_http_limit_req_module代码位于src/http/modules/ngx_http_limit_req_module.c,900多好代码可谓短小精悍。相关代码有多个中央数据结构:

  1. 红黑树:通过红黑树记录每个节点(依据评释时指定的key)的总结音信,方便寻找;
  2. LRU队列:将红黑树上的节点依照近日造访时间排序,时间近的放在队列底部,以便利用LRU队列淘汰旧的节点,防止内存溢出。

那多个重大目的存储在ngx_http_limit_req_shctx_t中:

typedef struct {
    ngx_rbtree_t                  rbtree; /* red-black tree */
    ngx_rbtree_node_t             sentinel; /* the sentinel node of red-black tree */
    ngx_queue_t                   queue; /* used to expire info(LRU algorithm) */
} ngx_http_limit_req_shctx_t;

里头除了rbtree和queue之外,还有一个称为sentinel的变量,那个变量用作红黑树的NIL节点。

该模块的骨干逻辑在函数ngx_http_limit_req_lookup()中,那个函数主要流程是什么样呢?对于每一个请求:

  1. 从根节点开首查找红黑树,找到key对应的节点;
  2. 找到后修改该点在LRU队列中的地方,表示该点方今被访问过;
  3. 施行漏桶算法;
  4. 没找到时依据LRU淘汰,腾出空间;
  5. 变更并插入新的红黑树节点;
  6. 执行下一条限流规则。

流程很显然,不过代码中牵涉到红黑树、LRU队列等高等数据结构,是或不是会写得很复杂?好在Nginx小编功力深厚,代码写得简单易懂,哈哈~

// 漏桶算法核心流程
ngx_http_limit_req_lookup(...){
  while (node != sentinel) {
    // search rbtree
    if (hash < node->key) { node = node->left; continue;} // 1. 从根节点开始查找红黑树
    if (hash > node->key) { node = node->right; continue;}
    rc = ngx_memn2cmp(key->data, lr->data, key->len, (size_t) lr->len);
    if (rc == 0) {// found
      ngx_queue_remove(&lr->queue); // 2. 修改该点在LRU队列中的位置,表示该点最近被访问过
      ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);// 2
      ms = (ngx_msec_int_t) (now - lr->last);
      excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000; // 3. 执行漏桶算法
      if (excess < 0) 
        excess = 0;
      if ((ngx_uint_t) excess > limit->burst)
        return NGX_BUSY; // 超过了突发门限,拒绝
      if (account) {// 是否是最后一条规则
        lr->excess = excess;    
        lr->last = now;    
        return NGX_OK; // 未超过限制,通过
      }
      ...
      return NGX_AGAIN; // 6. 执行下一条限流规则
    }
    node = (rc < 0) ? node->left : node->right; // 1
  } // while
  ...
  // not found
  ngx_http_limit_req_expire(ctx, 1); // 4. 根据LRU淘汰,腾出空间
  node = ngx_slab_alloc_locked(ctx->shpool, size); // 5. 生成新的红黑树节点
  ngx_rbtree_insert(&ctx->sh->rbtree, node);// 5. 插入该节点,重新平衡红黑树
  ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);
  if (account) {    
    lr->last = now; 
    lr->count = 0;
    return NGX_OK;
  }
  ...
  return NGX_AGAIN; // 6. 执行下一条限流规则
}

代码有二种再次来到值,它们的趣味是:

  • NGX_BUSY 当先了发生门限,拒绝
  • NGX_OK 未超越限制,通过
  • NGX_AGAIN 未当先限定,但是还有规则未履行,需举办下一条限流规则

上述代码简单掌握,但我们还有多少个难点:

  1. LRU是如何促成的?
  2. 漏桶算法是怎么样兑现的?
  3. 每个key相关的burst队列在哪个地方?

净:一切归零,从头开头

LRU是什么样贯彻的

LRU算法的贯彻很容易,假定一个节点被访问了,那么就把它移到行列的头顶,当空间欠缺需求淘汰节点时,就选出队列尾部的节点淘汰掉,首要反映在如下代码中:

ngx_queue_remove(&lr->queue); // 2. 修改该点在LRU队列中的位置,表示该点最近被访问过
ngx_queue_insert_head(&ctx->sh->queue, &lr->queue);// 2
...
ngx_http_limit_req_expire(ctx, 1); // 4. 根据LRU淘汰,腾出空间

敬:爱岗敬业,礼貌敬人

漏桶算法是何许贯彻的

漏桶算法的贯彻也比大家想象的简便,其中央是这一行公式excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000,那样代码的情趣是:excess表示近期key上遗留的呼吁数,此次遗留的哀告数
= 上次遗留的伏乞数 – 预设速率 X 过去的年华 +
1
。那么些1意味近年来以此请求,由于Nginx内部表示将单位压缩了1000倍,所以1个请求要转换成1000。

excess = lr->excess - ctx->rate * ngx_abs(ms) / 1000 + 1000; // 3. 执行漏桶算法
if (excess < 0) 
    excess = 0;
if ((ngx_uint_t) excess > limit->burst)
    return NGX_BUSY; // 超过了突发门限,拒绝
if (account) { // 是否是最后一条规则
    lr->excess = excess;    
    lr->last = now;    
    return NGX_OK; // 未超过限制,通过
}
...
return NGX_AGAIN; // 6. 执行下一条限流规则

上述代码受限算出当前key上残留的央浼数,假如跨越了burst,就径直拒绝;由于Nginx允许多条限速规则同时起效果,假若已是最后一条规则,则允许通过,否则执行下一条规则。

静:文件成堆,冷静沉着

单个key相关的burst队列在何地

从未单个key相关的burst队列。下边代码中我们看到当到达最后一条规则时,只要excess<limit->burst限速模块就会回去NGX_OK,并从未把多余请求放入队列的操作,那是因为Nginx是依照timer来管理请求的,当限速模块再次回到NGX_OK时,调度函数会统计一个延缓处理的时光,同时把这么些请求放入到共享的timer队列中(一棵按等待时间从小到大排序的红黑树)。

ngx_http_limit_req_handler(ngx_http_request_t *r)
{
    ...
    for (n = 0; n < lrcf->limits.nelts; n++) {
        ...
        ngx_shmtx_lock(&ctx->shpool->mutex);// 获取锁
        rc = ngx_http_limit_req_lookup(limit, hash, &key, &excess, // 执行漏桶算法
                                       (n == lrcf->limits.nelts - 1));
        ngx_shmtx_unlock(&ctx->shpool->mutex);// 释放锁
        ...
        if (rc != NGX_AGAIN)
            break;
    }
    ...
    delay = ngx_http_limit_req_account(limits, n, &excess, &limit);// 计算当前请求需要的延迟时间
    if (!delay) {
        return NGX_DECLINED;// 不需要延迟,交给后续的handler进行处理
    }
    ...
    ngx_add_timer(r->connection->write, delay);// 否则将请求放到定时器队列里
    return NGX_AGAIN; // the request has been successfully processed, the request must be suspended until some event. http://www.nginxguts.com/2011/01/phases/
}

俺们来看ngx_http_limit_req_handler()调用了函数ngx_http_limit_req_lookup(),并基于其重临值决定哪些操作:或是拒绝,或是交给下一个handler处理,或是将呼吁放入定期器队列。当限速规则都由此后,该hanlder通过调用函数ngx_http_limit_req_account()查获当前哀告须求的延迟时间,假若不必要延期,就将呼吁提交后续的handler举办拍卖,否则将呼吁放到定时器队列里。注意那么些定时器队列是共享的,并不曾为独立的key(比如,每个IP地址)设置队列。关于handler模块背景知识的介绍,可参照Tengine团队编著的Nginx开发从入门到精通

至于按请求速率限速的规律教学,可参看Rate Limiting with NGINX and NGINX
Plus
,关于源码更详实的分析可参考ngx_http_limit_req_module
源码分析
以及y123456yz的Nginx源码分析的git项目

王中媛帮集团主处理公事

结尾

本文首要讲解了Nginx按请求速率限速模块的用法和原理,其中burst和nodelay参数是不难滋生误会的,纵然可经过burst允许缓存处理突发请求,结合nodelay可以下降突发请求的拍卖时间,可是长时间来看他俩并不会增加吞吐量的上限,短时间吞吐量的上限是由rate决定的。要求越发注意的是,burst设置了nodelay时,系统弹指间的QPS可能会当先rate设置的阈值。

本文只是对Nginx管窥蠡测,愈多关于Nginx介绍的篇章,可参照Tengine团队编著的Nginx开发从入门到领悟

民政局 田青(文传大学16汉文)

不要等着事情来,要一往无前谋事做;主动和各位同事领导通报,善于言谈;境遇标题不用急,静一静会有更好的解决办法;主动争取下乡或长远基层的机遇,每便都会让你有至关紧要收获;不懂就虚心求教,争取让每件事都完成完美;总而言之,凡事主动、尽心尽力。每日最喜笑颜开的业务莫过于局里的人都喊“小田,来帮我个忙呗!”

田青去贫困农户调查

文件科 洪淇(文传高校16语教)

在希望和心烦意乱中来到了华夏农谷屈家岭实习地,实习单位管事人热情周详的接待与接济让我们深感暖和,对我们举行了热烈欢迎并表示会每一日为大家提供辅导和提携。我是绵绵于文书科与综合科办公室的实习生,一周下来,我的重中之重办事是收拾种种资料,学写种种文件,负责工委办公室来电、盖章。在我的干活中总计出“三心”:细心、耐心、热心。我会带着一颗笃定的心,高质量、高作用的姣好工作职分。

洪琪在养鸭场做调查

财政局办公室 韩书琴(经管大学 14财管)

统计,再接再砺的适应,认真的考察。初到办公室,懒散只会掩盖应有的光芒。我每一日都专门充实。拿自家帮企业主复印文件来说,寓目文件是基础:注意顺序、区分正反面、区分A3、A4纸张,往往是二十来页带有正反面的文件必要复印五、六份,如何快速、有各种、无差错的达成,必要在大脑里清晰的过一回。不在乎事情的轻重,做到了便是一份美好的取得。

韩书琴正在检查数据

电子政务 张长威(电信大学16电工)

满怀无限激动的心境,终于迎来了政坛见习的正统开端。我在政党电子政务部门,帮着首长整理文件,查找投资集团,招商引资,就好像此连忙七天就过去啦,收获了办公室经验,认识了重重决策者,相互成为朋友,相互扶助,乐此不疲。除此以外,还有他们的来者不拒招待,实习与美味更配哦!可想而知,在短短的那七日时间里,我得到了许多,比如文化,友谊。

张长威做网站体贴

政研室 蔡海川(文传大学15级广编)

走在实习的旅程中,驻足着团结平时匆忙的脚步,凝视着身边的人和物。在这一次的生活和读书体验中,我打算的改动自己,源于内心深处的想法。体验每一处差距,寻找每一处鸿沟,让投机的生活经验越发助长。在政研室的一周学习中,作为一名文科生,努力的去阅读一些有关政治性的文书材料,进步协调的写作能力和办公能力。“海内存知己,天涯若比邻”,利用暑假的赏月时光,每一日和同伴一起上班、一起游戏、一起沟通等,都会让自家以为现在的光阴赋予更有意义。

蔡海川剪辑摄像

档案室 余拉菲(计算机大学15计科)

肉眼里有事,任几时候都不会闲下来浪费时间;学会积极与客人交谈、请教,感受旁人的思索方法;沟通中,我认为很难成功的事,他们做起来却不难;我觉得无所谓的事,他们却是一丝不苟的相比较。那是我最应当反思和读书的地点。做任何事情的情态就是控制你所能站稳的可观,对待工作细节的程度也控制着您与客人之间的出入。

余拉菲查看资料

文件科 冯玉(文传高校16汉文)

在那么些酷热的秋季,我带着千头万绪的情怀来到了屈家岭,我必须适应这么些新的条件,新的办事,新的爱侣,那对于一个慢热的人的话并不不难。这一个星期让自家记念最深的是下乡的时光,COO十四年的创业之路让自身对又创业多了一份认识。当一份事业做的很好的时候,总会希望自己能做到更好,我想自己也务必以那种姿态激励自己一连开拓进取。那天车驶过的路很美,遇见了晚年,遇见了“五月”,期待遇见更好的亲善。

冯玉在皮蛋场访问四姨

音讯科 徐清月 (总括机大学16信管)

参加的行事:将文件资料分发到各部门的文档柜、统计并整治发文基本音讯、审核发文内容、制定有关屈家岭三秒钟消息早餐方案等。周二下乡调研,感觉农户都好热情,体会到回家的觉得,因为我要好也是乡村的子女。在此处,自己不主动是不会有人会记住你的,也从不人会积极性找你做作业。觉得没事可做,那时该如何是好?可以积极的去找自己单位COO,须求安顿工作。工作的关键意在多学习一些在学堂学不到的知识。

徐清月做下乡总括

政研室  陈峻峰(电信学院16级电工)

自家第三次接触这么的实习工作,现身了五光十色的难点,通过请教领导、老师、同学的艺术,我一步一步地在逐年成长。近来领导颁发的义务,我得以精确科学地按时按量地形成。此次见习,我不仅学会怎么样去开展人与人以内地交谈,而且也学会了众多真功夫。我会努力认真的成就此次见习,并在里面不断地升高自己!

陈俊峰与学长啄磨下乡感受

档案室 朱雨树(生哲大学16食品)

自身的第两次正式实习。如愿进入了档案室,遇见了人超级好的锋哥、豪爽幽默的丹姐和严正资深的孙二姨,每一遍相见都应有被纪念。在这七日,我学会了打孔、折档案盒、档案排序原则、制作装订线等。发现自家存在耐心不够的难点。档案工作具大批量重复性的特色,有时候我会沉不下气反复去做同样的事情。还需两次三番着力,希望今后会更好。

朱雨树在收拾素材

法制办  屈兴武(生理高校16生工)

在劳作进度中,我们询问到了农家的劳碌优良与无奈,市场条件千变万化,农产品收购价委靡不振,涝害干旱萦绕心头。痛恨自己学艺不精,卑不足道,除了驾驭那么些令人无奈的求实居然一无所长。

屈兴武在稻田做调研

人社局 温太红(数理高校16用到物理)

赶来屈家岭七日了,工作和生活上都获得广大拉扯,也学到了广大。但令自己印象最长远的是五次经历,具体情节便只是多描述。总括如下:对于平安题材,应时时保持警惕。你或许遇见朴实的好好先生,也可能是披着羊皮的狼。不要被所谓的利益迷惑,不要过多败露个人音信,更毫不随便地信任陌生人。这几回的经历,是执行的小插曲。分享出来,让更加多的小伙伴进步警惕,敲响安全警钟,莫让情报里的喜剧重演。

温太红与桃林里的太婆交谈


不忘初心,大家直接在路上!

加油,楚天荆英支农团

作者:楚天荆英支农团