Go 采用 goroutine 和 channel 实现工作池

假设有一组任务需要异步处理且量很大,那我们需要同时开启多个 worker 以保证任务的处理速度而不会堵塞任务。其他语言,可能会需要开启多进程来完成,多进程的控制、IO 消耗等会是个需要注意的问题,而这些 Go 都能帮我们很轻易的解决。

大致的实现要点和流程:

  • 创建2个信道,messages 用于传送任务消息,result 用于接收消息处理结果
  • 创建3个 Worker 协程,用于接收和处理来自 messages 信道的任务消息,并将处理结果通过信道 result 返回
  • 通过信道 messages 发布10条任务
  • 通过信道 result 接收任务处理结果

Memcached UDP 反射攻击漏洞

问题记录

  今天中午有同事反应某系统打开很慢,以为是电脑问题(手动偷笑)。打开网站一看,慢的连静态文件都是几KB/S的速度。这明显不合理啊。上服务器一查,CPU正常、内存正常、Web程序也正常。

  于是想到了网络带宽问题。用vnstat -i eth1 -l一看,惊呆了😮,出网带宽达到了 162.44Mbit/s,这不是被攻击了么?

3971524549705_.pic_hd

Go 采用 time.After 实现超时控制

场景:

假设业务中需调用服务接口A,要求超时时间为5秒,那么如何优雅、简洁的实现呢?

我们可以采用select+time.After的方式,十分简单适用的实现。

首先,我们先看time.After()源码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

// After waits for the duration to elapse and then sends the current time
// on the returned channel.
// It is equivalent to NewTimer(d).C.
// The underlying Timer is not recovered by the garbage collector
// until the timer fires. If efficiency is a concern, use NewTimer
// instead and call Timer.Stop if the timer is no longer needed.
func After(d Duration) <-chan Time {
	return NewTimer(d).C
}

time.After()表示time.Duration长的时候后返回一条time.Time类型的通道消息。那么,基于这个函数,就相当于实现了定时器,且是无阻塞的。

PHP 表单提交数据项过多被截取问题

问题描述

今早业务系统中的带宽工具,出现因 Form 表单中传递的数据项过多,而后端 PHP 出现缺失部分参数值的问题。

问题原因

php.ini中有一配置项max_input_vars,默认值为1000。

表示接受多少输入的变量(限制分别应用于$_GET$_POST$_COOKIE超全局变量) 指令的使用减轻了以哈希碰撞来进行拒绝服务攻击的可能性。如有超过指令指定数量的输入变量,将会导致E_WARNING的产生,更多的输入变量将会从请求中截断。