GY课程总结

上完全部课程,是时候来个总结。感觉挺坑的,做得作业估计都木有看,也对后面的实习木有太大影响。主要还是看接下来的面试。


==================后台系统基础==========================


整个系统架构分为四部分,客户端、接入服务、逻辑服务、存储服务。一般接入服务和逻辑服务会连在一起,但分开更好,符合大系统小做的想法。

在客户端处,有长连接和短连接的问题,各有利弊。长连接要求并发数高,并且会导致内存维护成本大(内存会是限制并发数的一个资源限制),以及终端耗电的问题。短连接是由于运营商的问题而存在的。各有利弊,综合考虑。

并且存在密码安全等问题。有明文、hash、salted hash、key stretching等方法。

1. hash:

哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要)。先来说说寻找碰撞法。从哈希本身的定义和上面的数据保护原理图可以看出,如果想非法登录系统,不一定非要得到注册时的输入口令,只要能得到一个注册口令的碰撞即可。因此,如果能从杂凑串中分析出一个口令的碰撞,则大功告成。用穷举法,通俗来说,就是在一个范围内,如从000000到999999,将其中所有值一个一个用相同的哈希算法哈希,然后将结果和杂凑串比较,如果相同,则这个值就一定是源字串或源字串的一个碰撞,于是就可以用这个值非法登录了。并且,可以知道有哪些用户具有相同的密码。彩虹表就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码。

2. salted hash:

当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,以确定密码是否正确。因为salt值是系统随机生成的,即使两个用户用了相同的密码,他们的hash值也不一样,黑客找出密码的几率大大减小了。

3. key stretching:

指的是由于大家设置密码时候普遍长度不长,同时也不够复杂。很容易被暴力破解。密码扩展是将一段原始密码通过一种方式扩展到比较长的文本。其中关键点是扩展过程一定要耗时(比如一秒钟),而且不能通过其他方式节省时间(这样黑客就不能走捷径了)。比如下面这样的一个耗时操作:

key = hash(password)
for 1 to 65536 do
  key = hash(key)

在登录时,服务器会派发一个token给客户端,这个token就是后续其他请求的凭证。

在同步数据时,想法很有趣。每个消息有一个编号,如1-100。在服务器上的最新消息是101,在客户端看到最新消息是100,就知道需要把新消息传输过去。如果发送过程丢了数据,客户端还是停留在100,下次依旧会更新。

在接入服务处,对外即客户端,要注意网络通讯、并发量、就近接入等,对内即逻辑服务,要注意请求路由、负载均衡、故障屏蔽等。

在逻辑服务处,依旧是大系统小做的思路。每个逻辑模块独立,逻辑上独立,甚至物理上独立,保障稳定性。

在存储服务处,有持久存储(ACIP, CAP, BASE),有缓存。充分使用好缓存,可以加快速度。

到了产品的运营,要减少手工操作。上线时可以灰度上线,部分上线来测试功能,如果可以就继续上线另一部分。

数据监控要有意义,可视化、可对比等。

还有一些优化的策略。

如果接入不成功,可以下发server list。自己制定ip,防止域名劫持。通过内置ip的方式也可以

域名劫持:

域名劫持是互联网攻击的一种方式,通过攻击域名解析服务器(DNS),或伪造域名解析服务器(DNS)的方法,把目标网站域名解析到错误的地址而达到无法访问目标网站的目的。

逻辑服务的模块,要有可伸缩性,柔性可用、万有一失,根据当前的状况,选择提供部分的服务。可调度性,可以屏蔽故障。

还要防止雪崩,如超时控制、重试次数限制、重试间隔、快速失败等方式。去中心化和多IDC(Internet Data Center)容灾。


==================LSH快速聚类应用==========================


基本的聚类方法,像是K-means、leader-follower这些。

还有一个lsh的方法,将相似的样本hash到相同的桶中去(高概率)。

SimHash,如怎么将一个文本进行hash。得到很多feature(如不同的单词),每个feature有不同的权重w。对feature进行hash,如1001,对应于相对应的权重,变成w -w -w w(1为正,0为负)。将所有的feature的这些w值加起来,就可以得到一个向量,最终值大于0为1,小于0为0,则可以使用一个fingerprint来表示这个文本。

图像也是类似。将它缩放、模糊、灰度、映射这样的处理。


==================敏捷迭代开发==========================


scrum

MoSCoW原则:

must 必须有

should 应该有

could 可有可无

won‘t 没有

测试驱动开发,持续集成


==================微信开放平台==========================


推拉结合


==================编程基础知识==========================


bitcask的存储模型。

Bitcask是一个日志型的基于hash表结构和key-value存储模型。何谓日志型?就是append only,所有写操作只追加而不修改老的数据,就像我们的各种服务器日志一样。在Bitcask模型中,数据文件以日志型只增不减的写入文件,而文件有一定的大小限制,当文件大小增加到相应的限制时,就会产生一个新的文件,老的文件将只读不写。如果数据文件这样持续的存下去,肯定是会无限膨胀的,为了解决个问题,和其他日志型存储系统一样Bitcask也有一个定期的merge操作。日志类型的数据文件会让我们的写入操作非常快。而如果在这样的日志型数据上进行key值查找,那将是一件非常低效的事情。于是我们需要使用一些方法来提高查找效率。在Bitcask模型中,除了存储在磁盘上的数据文件,还有另外一块数据,那就是存储在内存中的hash表,hash表的作用是通过key值快速的定位到value的位置。于是一个写操作就需要进行一次顺序的磁盘写入和一次内存操作。

http://www.cnblogs.com/napoleon_liu/archive/2011/09/29/2195193.html

一致性hash。

consistent hashing 是一种 hash 算法,简单的说,在移除 / 添加一个 cache 时,它能够尽可能小的改变已存在 key 映射关系,尽可能的满足单调性的要求。使用环形的hash空间。并且增设虚拟节点,保持平衡性。

http://blog.csdn.net/sparkliang/article/details/5279393

一些常用的工具。如gdb调试。Valgrind检测内存泄露、线程竞争、性能分析等问题。

==================IOS开发==========================


循环引用问题,与智能指针的问题类似。这里有一个弱引用、强引用的机制。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值