需要各个依赖节点均支持批量请求,需要考虑下面这些场景
复杂场景的批量更新问题
5. 循环单个更新请求,要控制事务的大小
6. 自定义sql,要控制sql语句大小
<update id="batchUpdateStatusErrorCode" parameterType="java.util.List">
update message_send_log
<trim prefix="set" suffixOverrides=",">
<trim prefix="status = case" suffix="else status end, send_times = send_times+1,">
when 1=2 then status
<foreach collection="list" item="item" index="index">
<if test="item.status !=null">
when id=#{item.id} and db_create_time=#{item.dbCreateTime} then #{item.status}
</if>
</foreach>
</trim>
<trim prefix="error_code = case" suffix="else error_code end,">
when 1=2 then error_code
<foreach collection="list" item="item" index="index">
<if test="item.errorCode !=null">
when id=#{item.id} and db_create_time=#{item.dbCreateTime} then #{item.errorCode}
</if>
</foreach>
</trim>
</trim>
where id in
<foreach collection="list" index="index" item="item" separator="," open="(" close=")">
#{item.id}
</foreach>
and msg_id = #{msgId} and db_create_time between #{start} and #{end}
</update>
将请求放入线程池异步请求子模块。下游处理超时,上游线程池堆积满以后如何处理?是否允许线程池有队列,如果有重启丢弃问题处理
上游发消息,子模块监听。无法感知下游状态,需要上有提供请求唯一标识,下游维护反查接口
伪异步设计
两类状态机
状态机思考
接口入参增加幂等key与bizType字段,由上游提供幂等
中台设计常用的实现方式,维护成本低,扩展性好,例如实现批量请求,因为幂等key通常设计为bizType+唯一key,等同于是一个唯一的字段,而不是多字段,从而实现批量处理更简单
下游基于上游业务字段实现幂等
公司的财务设计实现方式,维护到后期导致出现,业务繁多时,不同业务间出现多种幂等字段组合,因此接口也存在多个幂等接口实现
引用1. {“code”:3,“detail”:[],“message”:"proto: (line 1:152): invalid value for enum type: “NUMBER_1"”}
swagger逆向生成脚本
java -jar modules/swagger-codegen-cli/target/swagger-codegen-cli.jar generate \
-i http://www.myhost.com/myapi.swagger.json \
-l java \
-o /Users/gallant/Documents/swagger \
--model-package org.gallant.dto \
--api-package org.gallant.api
就单个接口而言,吞吐与并发是互斥的,设计过程中可以基于实际的业务进行设计。就像jvm的Parallel GC与CMS GC的选择