后端开发和部署的若干约定

上周新人 Los 加入;对 Yii 熟悉的对 Laravel 不熟悉,反之亦然;这里记录一下代码设计的约定;关于 Redis 的约定初步成型(after 3 weeks since 1st Nov.);

原则
  • 结构良好;
  • 代码整洁;
  • 风格一致;
数据库
  • 数据库名:db_*
  • 时间字段
    _intm 插入时间,_uptm 更新时间,_detm 删除时间,_pptm:参与时间;
    使用 UNIX 时间戳格式;
    时间字段大多内部使用,提升可测性和运营排查问题;
Redis 的原则
  • 一个应用一般使用一个 redis 实例;
    不同的应用可以使用同一个实例;
  • 一个应用一般使用一个库;
    不同的应用一般使用不同的库;
    多库不会增加性能,只会增加部署复杂性;
  • 使用命名空间对库进行分隔;
    提高 key 的可读性;改善 key 冲突的可能性;
Redis 库
  • 0:通常不使用,保留供 laravel 升级使用;
  • 1:数据缓存;
  • 其他:一般不使用,特殊业务考虑使用;
  • 32:st:$short_tag => long_url;
不同环境下的 Redis 库配置
环境 库ID 范围
me(local) 1 [1-10]
dev 11 [11-20]
test 21 [21-30]
prod 31 [31-40]
Redis key 约定
  • :做间隔符,形如:a:ba:b:c;字母全部小写;
    a:业务;b:数据(by 指明筛选条件);c:条件;
    对于 b 要使用一个 word 来表示数据或者 action,比如:chatter,onliner,focus;
    key 不要太长;简洁能标明主旨即可;可以通过 redis_key 字典查询具体含义;
    不标注数据类型,不标注 _list(抛弃执念);
  • www:user:$id
    哈希结构,www 表示默认业务;user 表示用户表;$id 表示主键字段值;
  • www:uid_by_phone:$phone
  • 已发言用户:im:chatter_by_demand_id:
    zsets 结构,首次发言时间为 score,uid 为 member;
  • 在线用户:im:onliner
    哈希结构,uid 为 field,上线时间为 value;或者 zsets 结构;
    相对 zsets,哈希耗费小,数据多时可自动压缩;
  • 接口形式:i:接口索引:
    比如:i:a08 就是 a08 接口默认类型(string)数据;
接口
  • API Design First
    接口的设计很重要;如何对接口分组,要考虑 controller 和 model 两方面;
  • controller/action 设计:demand/b42,其中 b42 就是接口文档的命名索引;
    好处是便于交流,要了解其具体含义要依靠查询接口文档来解决;往常 action 的命名是一个难题,命名不好的话反而造成误导;索引法至少不会太坏;
  • 接口的测试代码和实现代码 同等重要
    探索性测试用例的设计、测试代码的编写,要和实现代码一起 review;
关于测试
  • 模块的可测试性;
    类似 前端,后端要建立模块测试机制,实现可单独调试、可单独测试、可单独发布,以支持持续集成、持续测试、持续发布;
  • Debug 技术不仅要掌握,而且要精通;
    比如 ZendDebug;
    不会 Debug,编码效率不会太高;学会 debug,上了一个台阶;
    没有条件 Debug,解决问题的效率不会太高;
  • PHPUnit;
    Yii 和 Laravel 框架的默认 Unit Tests 测试工具都是 PHPUnit;Yii 也使用 codeception 做更多测试;
  • 测试有益心理健康;
    一个工程师害怕改代码,那简直是笑话;
    改了一个问题引起两个问题,那更是灾难;
    有测试做保障,特别是自动化测试,可以解除恐惧,卸掉心理负担,从此放心大胆地重构,质量还能得到保证;

你可能感兴趣的:(后端开发和部署的若干约定)