
# 停写不停读切换方案
停写不停读，主要指切换期间，为了追求较好的用户体验，保持一部分读的服务不停服，保持在线可使用状态；为了保持数据一致性，写的服务仍然采用停服方式进行切换。从业务对外体验上，多数用户感知不到停服的影响，比如某购物平台，用户仍然可以浏览商品，但是不能下单，下单时可友好的提示：系统正在升级中，预计凌晨4点恢复，请您稍后重试下单等。
1. **四种停写不停读切换方案对比**
停写不停读切换有4种方案可以选择：
表1四种停写不停读切换方式 
| **方案**                  | **操作方式**                         | **适用场景**                                    | **操作复杂程度** | **改造工作量** |
|:---|:---|:---|:---|:---|
| 网关拦截                    | 接入层，服务网关拦截写请求，放通读请求              | 入口统一，有统一网关，网关具有拦截能力，并对拦截的接口能配置友好的提示。        | 简单         | 无需改造      |
| 停止写服务，读服务不停             | 写服务或对应接口shutdown，读服务或对应接口保持alive | 应用层服务已做读写分离场景，每个服务只进行单独的读操作或写操作，没有同时进行读写的服务 | 简单         | 无需改造      |
| 应用层先做读写分离改造，然后停止写服务，读不停 | 应用层修改代码，拆分读写服务                   | 应用层服务没有读写分离的场景                              | 复杂         | 大         |
| 中间件层/数据层直接回收写权限         | 中间件层/数据层设置业务账号只读，收回写权限           | 直接回收写权限，业务系统会报错，需要做相关轻微改造处理这些报错             | 简单         | 轻微改造      |
   
- **网关拦截**
  服务网关（Gatekeeper、Zuul、Kong等），拦截写请求，放通读请求；例如Gatekeeper网关可以拦截POST请求，只放通GET请求。这可以通过在Gatekeeper网关上配置规则来实现。可以设置一个规则，只允许GET请求通过，拒绝POST请求。
  图1网关拦截方案   
  ![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002142361302.png "点击放大") 

- **写服务关停**
  应用层服务已做读写分离的场景，直接关停写服务或对应接口下线shutdown，读服务或对应接口保持在线，从而达到业务只读不写的效果。
  图2写服务关停方案   
  ![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002177562345.png "点击放大") 

- **应用改造**
  应用代码进行读写分离改造，改造后再按照8.4.3.3写服务关停方案实施，实现只读不写的效果。
  图3应用改造方案   
  ![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002177520737.png "点击放大") 

- **中间件层/数据层配置只读**
  中间件层和数据层收回业务账号写权限，不允许服务写中间件层/数据层的操作。
  图4中间件和数据只读方案   
  ![](https://support.huaweicloud.com/usermanual-caf/zh-cn_image_0000002142203258.png "点击放大") 
 
