我不得不说一些关于HTTP的事情。
对HTTP的支持普遍存在,但是使用python会很低效。不仅是因为不能像zeromq那样在其他线程处理事务,对HTTP解析也很缓慢。常常持久连接(keep-alive connection)也不受支持。
同时HTTP是复杂的,如果你认为不是这样,你就错了。来看个简单的例子吧。你可能写出下面的代码:
理论上服务器会返回一个写有“hello”的页面(在wsgiref下测试),但是实际上:
The 304 response MUST NOT contain a message-body, and thus is always terminated by the first empty line after the header fields
(304响应必须不包含消息体,因此通常会被头域后的第一个空行终止)
意思是说“hello”行会被客户端在下次请求时识别成响应的第一行。这在一些设置中会导致缓存污染和安全漏洞。有多少使用HTTP的程序员意识到了这个现象呢?还有更多莫名其妙的细节。
HTTP不要在内部消息中使用,因为它容易使用但不简单,甚至复杂到使用了5个RFC也只描述了基本内容。即使误解最简单的内容可能会导致安全漏洞。
说实话,大多数微服务(microservice)使用了HTTP的子集,比如只认可200的响应码(其他的都作为失败),不使用特别的数据头或类似的,这可能不会出问题。当然这不是真正意义上的HTTP(但是经常用来负载均衡的代理则需要真正的HTTP,比如HAProxy),而且需要对HTTP特性非常熟悉的人才能构建安全的HTTP子集。
联系客服