规整数据的重要性

对于后端而言,无论前端是否校验了表单(前端可能出于用户体验会做校验),后端都必须校验一次。并且在数据有问题时及时终止 处理。常见的请求处理如下:

请求 -> Web后端 -> 服务1
                <-
                -> 服务2
     <-         <-
            -> 异步任务
                -> 服务3
                <-

如果我们不在最开始就将数据处理成规整的、统一的结构,那么在异步任务处,还需要再次做各种校验,尤其是当异步任务大量使用 到web后端接收到的参数时。

因此,在web后端接受到参数时,就应当将数据处理好,拒绝不正常的请求和参数。为其后所有的处理提供一个规整的、统一的、干净 的参数。

于此同时,有另外一个让人忧心。当服务的数量多起来之后(微服务拆分可以将服务数量骤然提升,因业务本身数量增加也会导致服务数量 增加),服务与服务之间是否能够相互信任?他们是否需要校验对方的参数?是否需要:

  • 无条件的相信对方的参数?
  • 需要验签?

如果验签,那么务必保证大家的验签算法都一致、足够安全、足够简单。否则人手一套验签算法,只会耗费无数心力。更好的方式,仍然 是在整个流量进入的最开始,就处理好,其后将不同的服务划分成不同的服务群。服务群处在同一个VPC里,它们之间相互信任。服务群 之间可以选择进行一些校验。

另外服务多起来之后,还会面临一个与此话题无关的话题,随着函数请求变成了网络请求,请求的返回状态数量骤增,而状态判断则是 所有网络调用可能返回状态的组合。要在一群不可靠的服务间构建可靠的服务,很难。而如果信任这些服务,那么服务的质量则会受底层 服务质量所影响。

最后,就让我无脑的结束这个话题。提前规整数据,看起来多耗费了心力,但长远看来,省了很多心力。


更多文章
  • Web开发系列(四):Flask, Tornado和WSGI
  • Web开发系列(三):什么是HTML,CSS,JS?
  • Web开发系列(二):HTTP协议
  • Web开发系列(一):从输入网址到最后,这个过程经历了什么?
  • SNI: 让Nginx在一个IP上使用多个证书
  • Haskell: infixl, infixr, infix
  • Haskell简明教程(五):处理JSON
  • Haskell简明教程(四):Monoid, Applicative, Monad
  • HTTPS 的详细流程
  • OAuth2 为什么需要 Authorization Code?
  • 任务队列怎么写?python rq源码阅读与分析
  • XMonad 配置教程
  • Haskell简明教程(三):Haskell语法
  • Haskell简明教程(二):从命令式语言进行抽象
  • Haskell简明教程(一):从递归说起