主要从java的角度来讨论服务端程序设计常见的需要考的问题
1、对应的状态机,协议工程方面
首先服务端基本上是异步,如果一个请求由多个服务提供者提供,那么需要维护一个状态机,简单的可能是业务的ID,然后对应的一个是否完成服务的list,需要解决,服务完成后正常的从缓冲中清除,如果其中一个服务没有返回,那么在规定时间内必须返回异常。
如果你懂编译原理或者协议工程,那么在服务的稳定性和有雅性上可能会处理的更好。
2、服务隔离的处理,请求超时的处理,熔断的处理
服务提供方不可用的情况下,不会导致请求方得不到回应,而且在规定时间内必须有响应,还可以提供降级处理,比如:hystrix框架,简单见hystrix学习概要
3、限流的处理
a)队列的限流,一般使用jdk中的阻塞队列
b)信号量限流,一般使用jdk中的信号量
c)基于令牌和桶的限流,一般使用Guva的RateLimiter,或者使用redis来进行限制,如果使用nginx的话,nginx提供对应的功能
4、自动负载均衡的处理
服务负载均衡策略,一般会考虑轮询、最少连接、源地址保持等策略。如果多个线程从一个队列上获得数据,如何做负载均衡?简单的解决方案就是,通过阻塞读取队列上的数据,进行处理,每读取N个,加入到队列进行处理,休眠时间的长短上做文章。需要少量分流的策略,拿出数据后,休眠的时间长一点,从而拿到较少的数据进行处理。
5、服务监控的处理
监控平均响应时间,监控日志,监控jvm情况等,如果搭建完整的监控体系会很好,如果没有,写入到redis中也是不错的选择,将监控数据写入到数据库比较重。
6、线程模型
这部分主要可以参考面向模式的体系结构卷2:用于并发和网络化对象的模式