backend

技术选型的技巧

总结一下后端常用的工具和蕴含的算法,应该把 GitHub 5000 star 以上的项目都看一下,同类的工具只了解一个就够了,不要研究重复的知识。

不要魔改原系统

所以我们的建议是不要改动原系统,而是要开发辅助系统:监控,报警,负载均衡,管理等。以 Redis 为例,如果我们想增加集群功能,不要去改动 Redis 本身的实现,而是增加一个 proxy 层来实现,Twitter 的 Twemproxy 就是这样做的,而 Redis 到了 3.0 后本身提供了集群功能,原有的方案简单切换到 Redis3.0 即可。详细可参考 (http://www.cnblogs.com/gomysql/p/4413922.html)

如果实在想改到原有系统,怎么办呢?我们的建议是直接给开源项目提需求或者 bug,但弊端就是响应比较缓慢,这个就要看业务紧急程度了,如果实在太急那就只能自己改了,不过不是太急,建议做好备份或者应急手段即可。

所以,如果你有钱有人有时间,投入人力去重复发明完美符合自己业务特点的轮子也是很好的选择!毕竟,土豪们(BAT…… 等)很多都是这样做的,否则的话我们也就没有那么多好用的开源项目了 🙂

魔改系统的另一个不好是员工的不满。对于员工来说,自然希望能够在简历上写上一些通用的技能,而使用公司内部工具的化,对员工的发展也不利。

来源:https://book.douban.com/review/6456359/

突然想起来我们之前一个经验比较丰富的同事告诉我,他学习的方法就是一件事情先找到方法给干掉,先知道怎么用,再系统的看书学习,借此和大家分享。

不要选择过于小众的技术

如果你是你们新用户最大的用户,那么你遇到的问题将会是最大的

Maturity = (Blood + Sweat) / Complexity

Choose Boring Technology

同一类的技术不要引入重复组件。

使用 Ansible 部署服务

ansible 的操作是幂等的,也就是说可以进行任意次操作而不会造成副作用。ansible 基于 ssh,不需要在目标机器上运行任何特殊的 agent。

安装

sudo pip3 install ansible

Hosts 文件

ansible 使用 hosts 文件来管理主机,每个 Hosts 中定义多个 Inventory,可以认为是分组的主机

默认位置:/etc/ansible/hosts。可以使用 -i 来指定 Inventory 文件

format

[inventory_name]
192.168.0.1
# 或者域名

如果需要改变登录使用的用户名,可以在当前目录的 ansible.cfg 或者 $HOME/.ansible.cfg 或者 /etc/ansible/ansible.cfg 中指定:

[defaults]
remote_user=rabbit

动态 Inventory

see ec2.py

Builtin Variables

see https://github.com/lorin/ansible-quickref

运行命令

ansible 使用 module 来组织命令。

选项

-m  module to run
-s  use sudo
-k  ask for key/password
-u  user
-a  传递给 module 的参数

例子

ansible -i ./hosts all -m ping 
ansible -i ./hosts all -m shell -a "apt-get install nginx"
ansible -i ./hosts all -s -m apt -a "pkg=nginx state=installed update_cache=true"

响应

host | state >> {
    "changed": false # whether the host is affected by the command
}

ansible 内置的 module 有:ping, shell

Playbook

ansible 可以直接在命令行使用,但是最终需要的命令可能很长,不过最好的方式还是使用 playbook 来把需要运行的命令写成 yaml 文件。就像是 docker 相关的命令可以写成 docker-compose 的配置文件一样。

- hosts: local
  # define variables
  vars:
   - docroot: /var/www/serversforhackers.com/public
  # more options goes here
  # ...

  # tasks are the basic action unit
  tasks:
   - name: Add Nginx Repository
     # module apt_repository
     apt_repository: repo="ppa:nginx/stable" state=present
     # register an event
     register: ppastable

   - name: Install Nginx
     apt: pkg=nginx state=installed update_cache=true
     # listen an event, run only it happens
     when: ppastable|success
     register: nginxinstalled
    # notify calles handlers
     notify:
      - Start Nginx

   - name: Create Web Root
     when: nginxinstalled|success
     file: dest={{ "{{" }} docroot {{ "}}" }} mode=775 state=directory owner=www-data group=www-data
     notify:
      - Reload Nginx

  # handlers are like functions, called by `notify`
  handlers:
   - name: Start Nginx
     service: name=nginx state=started

    - name: Reload Nginx
      service: name=nginx state=reloaded

部署 docker

使用 ansible 部署 docker 镜像

REF

这篇文章主要参考 这里