请选择 进入手机版 | 继续访问电脑版

基于OpenAPI网关业务集成C10K问题解决方案

技术博客 2022-4-27 11:33 2602人浏览 0人回复
原作者: 高树江 收藏 邀请
摘要

资料文献: IKM:YonBIP技术方案-被集成方案IKM地址 视频:YonBIP技术方案-被集成方案视频讲解 某项目入BIP基本档案通过MQ与档案同步服务采用API的形式进行档案同步 方案如下图所示: C10K问题 所谓c10k问题,指 ...

资料文献:
IKM:YonBIP技术方案-被集成方案IKM地址   视频:YonBIP技术方案-被集成方案视频讲解

某项目BIP基本档案通过MQ与档案同步服务采用API的形式进行档案同步
方案如下图所示:
6268b1cba977f.png

C10K问题
所谓c10k问题,指的是:服务器如何支持10k个并发连接,也就是concurrent 10000 connection(这也是c10k这个名字的由来)。由于硬件成本的大幅度降低和硬件技术的进步,如果一台服务器能够同时服务更多的客户端,那么也就意味着服务每一个客户端的成本大幅度降低。从这个角度来看,c10k问题显得非常有意义。

6268b3963dcf3.png
服务的处理能力总是有极限的,随着微服务的流行,服务和服务之间的依赖越来越强,调用关系越来越复杂,服务和服务之间的稳定性越来越重要。在遇到突发的请求量激增,恶意的用户访问,亦或请求频率过高给下游服务带来较大压力时,我们常常需要通过缓存、限流、熔断降级、负载均衡等多种方式保证服务的稳定性。其中限流是不可或缺的一环


RabbitMQ推拉模式
消费者与消息存储方Broker一般有两种通信机制:推(PUSH)、拉(PULL)。
推模式:消息发送者将消息发送到Broker,然后Broker主动推送给订阅了该消息的消费者。
拉模式:消息发送者将消息发送到Broker上,然后由消息消费者自发的向Broker拉取消息。

6268b47cc2217.png
6268b4b9981f2.png

解决方案:
业务处理,预算数据100条一发,再加个3秒sleep后进行业务处理。
6268b4ccb387b.png
示例代码:
  1. <font size="4">if(queueBudget.getCount()<100){
  2.             return;
  3.         }else {
  4.             // 预算模型编码 - 来源:自己建的预算模型
  5.             map.put("cubeCode","dhcbudgetcube");
  6.             // 预算系统模型编码 - 来源:自己建的预算系统模型
  7.             map.put("sysCode","dhcbudgetsys");
  8.             List<MonthBudget> data = queueBudget.getData();

  9.             data.forEach((s)->{
  10.                 Map<String, Object> dataMap = new HashMap<>();
  11.                 dataMap.put("StartDate",s.getStartDate());
  12.                 // 必填项
  13.                 dataMap.put("EndDate",s.getEndDate());
  14.                 // 项目编号
  15.                 dataMap.put("projectCode",s.getProjectCode());
  16.                 // 项目预算科目UID
  17.                 dataMap.put("**.**ountUid",**.**ountUid());
  18.                 // 年月
  19.                 dataMap.put("month",s.getMonth());
  20.                 // 预计金额
  21.                 dataMap.put("budget",s.getBudget());

  22.                 if("3".equals(s.getType())){
  23.                     // 3为删除,待确认
  24.                     dataMap.put("type",s.getType());
  25.                 }
  26.                 dataList.add(dataMap);
  27.             });
  28.             map.put("data",dataList);

  29.             TimeUnit.SECONDS.sleep(3);
  30.             String apiDataResponse =  postForEntity(OpenApiURL.PROJECT_MONTH_BUDGET_SAVE,map, String.class);
  31.             String code = JSONObject.parseObject(apiDataResponse).getString("code");
  32.             if("200".equals(code)){
  33.                 queueBudget.clean();
  34.             }
  35.             LogBusiness.logInfo("项目月别预算插入","批量进入"+queueBudget.getCount()+"条");

  36.         }
  37. </font>
复制代码








6268b20904155.png
6268b4396e47b.png
本文暂无评论,快来抢沙发!