我在《软件设计的核心方法及实例解析》里提到软件设计的核心方法是分解和组合。分解粒度上,不同的架构师想法不一样,但是却有一点共性:设计一定要把不稳定的部分做封装,对外暴露稳定的部分,这也是有接口隔离这一原则的本质原因。
分解的最小单位是服务,所有的服务设计要考虑以下7个维度。
伸缩性
服务实例化有N多种方法,包含事前调用。这就允许大量客户端不需要考虑后端的资源情况,因为调用的时候,你需要多少服务实例后端可以成比例的扩容。
安全性
所有面向服务的平台都会把安全做为一等公民。它们对所有的调用都要求授权。不仅针对于客户端对服务端发起的请求,服务之间的调用也需要鉴权。可以使用鉴权传播机制来支撑信任链模式。
吞吐量和可用性
服务可以接受队列形式的调用,这样可以通过简单的队列化来处理大量消息。队列化可以增加可用性,因为可以通过多种实例来处理相同的入队数据。
响应性
服务可以通过掐死调用或者放入缓冲池来避免过载。
可靠性
客户端和服务端可以通过使用可靠的消息协议来确保传递,处理网络连接,甚至对调用进行重排。
一致性
服务需要支持事务,事务是需要最终一致的。不管是什么类型的服务,事务中处理链条上任何错误都要求整个事件终止。
同步性
就算客户端是多线程的,整个服务也需要自动同步。
昨天带小鲜肉去味多美,因为出门的时候,邻居奶奶跟小鲜肉说话,他不怎么回话,我就批评教育了他。他不舒服,把口罩撕碎了。我们没说话进了味多美选完了明天的早餐,小鲜肉去排队结账。有个脸盘特别大的女生插队到了小鲜肉前面。我以为她没看清楚队尾,我就过去告诉她队尾在哪里。
她说:“你们什么时候来的呀”
我没弄清楚她的意思,很自然的说:“我们一直就在这里呀”
然后大脸女生就开始了吵架的口气,说:“我早就来了,刚才过去放面包了。我看你们那时候还在选面包呢。”然后另外一个女生过来排到了队尾。大脸女生说:“我是排在她前面的。”
刚跟小鲜肉闹完别扭,加上天气热本身火大。碰上这火上浇油的,我也不lady了,顶她:“那人家也没到我们前面呀。”
大脸女生一听回到了队尾,也一边吵架模式说着什么,我忘了。但其中有一句引起了我的注意:“你这是给孩子做了什么榜样呀!”
我一听她把小鲜肉扯进来,彻底引燃了我的引线。我说:“你说这些想让自己好过,我不会让你得逞,你做的不对!”
大脸女生又开始反驳,她说什么,我都是那句:“你做的不对!”旁边人劝大脸女生少说两句,最终她闭了嘴。
吵架按比分来算,我是吵赢了的。但是好容易吵一次架,吵的不漂亮,我耿耿于怀啊。因为我没有说服她。我要是整体整理好思路,摆出问题的根本点:
1、你如果之前排在前面,排在谁前面,就去那里,人家认,别人也不说什么。随便找一个地方,你这就是插队。
2、你还专门插到小孩前面,欺负孩子,无耻!
3、本身做的不对了,吵架时还把孩子扯进来,利用道德绑架,企图对孩子造成不良影响,坏蛋!
这样说她就算嘴里不饶,心里也会理亏了。吵架没有发挥好,着实遗憾呀。
17年前,有个成都的朋友说他们那边的人都会为很小一件事吵架,本质上是生活节奏慢,大家都闲的没事干。当然那是很久之前的成都了。想想没有大事操心其实是很幸福的。
设计服务要考虑的7个维度,大家其实可能都知道,但是总结的不多。总结的不多,用的时候就会出现“吵架没有发挥好”的遗憾,所以还是要多总结。