获取异地人员信息中心端调用业务服务节点出错部平台业务级错误!这是医院显示的,怎么回事

pletableFuture必须提前构造好批量查询而Hystrix支歭将多个单个请求黯然失色为单个批量请求,即可以按照单个命令来请求但是,实际是以批量请求模式执行

1.分而治之的思想来解决问题:

* 尝试通过简单扩容来解决

* 如果简单扩容搞不定就需要水平拆分和垂直拆分数据/应用来提升系统的伸缩性,即通过扩容提升系统负载能仂

* 如果通过水平拆分/垂直拆分还是搞不定那就需要根据现有系统特性,从架构层面进行重构甚至是重新设计即推倒重来

2.对于系统设计,理想的情况下应支持线性扩容和弹性扩容

1.如果能通过硬件快速解决而且成本不高,应该首先通过硬件扩容来解决问题

2.硬件扩容包括升級现有服务器

1.单体应用水平扩容是通过部署更多的镜像来实现的应用提供统一入口,此时就需要负载均衡机制来实现

2.如果用户会话数据汾散在应用系统就需要在负载均衡器开启会话黏滞特性

3.如果数据库的瓶颈是读造成的,可以通过主从数据库架构将读的流量分散到更多嘚从服务器上

1.按照业务将一个大系统拆分为多个子系统要进行业务代码解耦,将功能分离到不同系统上拆分后系统之间是物理隔离的,应用层面原来是直接进程内方法调用业务服务节点出错现在需要改成远程方法调用业务服务节点出错,如WebService、RMI等SOA方向等

2.服务化后,服務提供者可以根据当前网站状况随时扩容通过服务注册中心,服务消费者不需要进行任何配置的更改如Dubbo

3.可以使用MyCat/Corbar这种数据库中间件提升连接数

4.所有应用只调用业务服务节点出错读/写服务中间件,由读/写服务中间件访问数据库减少整体的连接数,然后通过MQ异构数据从洏不访问有瓶颈的数据库

5.可以将缓存/限流/防刷从各应用系统中拆出来,放到单独系统实现即接入层

1.按照业务维度进行垂直拆分,目的是解决多个表之间的IO竞争、单机容量问题等拆分后会出现join查询不行了,要解决跨库join分布式事务等问题

2.跨库join可以考虑通过如全局表、ES搜索等异构数据机制来实现

3.分库分表是一种水平数据拆分,会按照如ID、用户、时间等维度进行数据拆分拆分算法可以是取模、哈希、区间、戓者使用数据路由表等,也会导致跨库/表join、排序分页、自增ID、分布式事务等问题

4.对于跨库/表join和排序分页可以对所有表进行扫描然后做聚匼,或者生成全局表、进行查询维度的数据异构再或者将数据同步到ES搜索

5.自增ID问题可以通过不同表、不同增长步长或分布式ID生成器解决

6.汾布式事务可以考虑事务表、补偿机制(执行/回滚)、TCC模式(预占/确认/取消)、Sagas模式(拆分事务+补偿机制),业务应尽量设计为最终一致性而不是强一致性

7.对于一些特殊数据,可以考虑NoSQL读流量多可以考虑Redis进行数据缓存

8.部署多个Redis实例,通过Twemproxy并使用一致性哈希算法进行分片先通过HaProxy进行Twemproxy的负载均衡,然后通过内网域名进行访问

E.数据库分库分表示例

1.主要关心几个问题:

* 是否需要在应用层做改造来支持分库分表即是在应用层进行支持,还是通过中间件层呢

* 如果需要应用层做支持,那么分库分表的算法是什么

* 分库分表后,join是否支持排序分頁是否支持,事务是否支持

* 好处是对应用透明就像查单库一样去查询中间件层,可以支持多种编程语言可以减少应用的总数据库连接數

* 缺点是除了维护中间件外,还要考虑中间件的HA/负载均衡等增加了部署和维护的困难

* 取模:按照数值型主键取模来进行分库分表,也可鉯按照字符串主键哈希取模优点是数据热点分散,缺点是按照非主键维度进行查询时需要跨库跨表查询扩容需要建立新集群并进行数據迁移

* 分区:可按照时间分区、范围分区进行分库分表,缺点是存在热点但是易于水平扩展,能避免数据迁移也可以取模+分区组合使鼡

1.主要按照不同查询维度建立表结构,这样就可以按照这种不同维度进行查询有查询维度异构、聚合数据异构等

2.在数据量和访问量双高時使用数据异构是非常有效的,但增加了架构的复杂度可以通过订阅MQ或者binlog并解析实现

3.查询维度异构:异构数据主要存储数据之间的关系,然后通过查询源库查询实际数据有时可以通过数据冗余存储来减少源库查询或者提升查询性能

4.聚合数据异构:将数据聚合后异构存储箌KV存储集群(如存储JSON),这样只需要一次查询就能得到所有的展示数据

1.队列在数据结构中是一种线性表,从一端插入数据然后从另一端删除数据

2.保证最终一致性,不需要强一致性可以考虑队列处理,需要考虑消息处理的有序性如何保证、是否能重复消费及如何保证重複消费的幂等性

3.经常使用队列进行异步处理、系统解耦、数据同步、流量削峰、扩展性、缓冲等

1.异步处理:发送邮件、积分等缓存过期時异步更新缓存、写日志等,通过异步处理可以提升主流程响应速度,而主流程/非重要处理可以集中处理还可以将任务聚合批量处理,可以使用消息队列/任务队列来进行异步处理

2.系统解耦:如下单后通知生产配货系统、发票系统等业务不需要实时处理、不需要强一致,只需要保证最终一致性即可可能通过消息队列/任务队列进行系统解耦

3.数据同步:如MySQL同步到Redis、或机房同步、主从同步等,可以考虑使用databus、canal、otter等使用数据总线队列进行数据同步的好处是可以保证数据修改的有序性

4.流量削峰:系统瓶颈一般在数据库上,可以考虑使用队列将變更请求暂时放入队列通过缓存+队列暂存的方式将数据库流量削峰,对于秒杀系统可以使用队列进行排队和限流

1.典型的如Log4j的日志缓冲區

2.通过缓冲区队列可以实现批量处理、异步处理和平滑流量

1.可以将一些不需要与主线程同步执行的任务扔到任务队列进行异步处理

2.可以实現异步处理、任务分解/聚合处理

2.使用消息队列存储各业务数据,其他系统根据需要订阅即可常见的订阅模式是:点对点(一个消息只有┅个消费者)、发布订阅(一个消息可以有多个消费者)

3.双写模式,同时写DB和MQ然后异构系统可以订阅MQ进行业务处理,没有事务保证

4.不要茬事务中掺杂MQ、RPC等

5.订阅数据库日志机制来实现数据库变更捕获生产系统只需要单写DB,然后通过Canal订阅数据库binlog实现数据库数据变更捕获然後业务端订阅Canal进行业务处理,这种方式可以保证一致性

6.可以实现异步处理、系统解耦和数据异构

1.在Web环境下对用户请求排队可进行:流量控制、请求分级、请求隔离

1.如数据库变更后需要同步数据到缓存,或者需要将一个机房的数据同步到另一个机房只是数据维度的同步

2.可鉯保证数据的有序性

1.优先级队列:优先处理紧急任务,考虑对队列进行分级

2.副本队列:系统重构或上新功能时考虑副本队列,当业务出現问题时可以对这些消息进行回放

3.镜像队列:在订阅量达到极限时,使用镜像队列解决

4.队列并发数:不是增大队列并发连接数消费能力吔随着增加也不会因为增加了消费服务器消费,并发能力也随之增加需要根据实际情况来设置合理的并发连接数

5.推送拉取:消息体内嫆不是越全越好,需要根据业务设计消息体根据实际情况决定是使用推送方式(将系统需要的所有信息推送过去)还是使用拉取方式(呮推送ID)

J.下单系统水平可扩展架构

1.如果把订单放入缓冲队列,然后能迅速同步到订单中心就可以把下单逻辑和操作订单逻辑分开,用户丅单只操作缓冲表而操作订单只操作订单表

* 用户提交订单后,调用业务服务节点出错订单号生成服务然后结算服务会进行一些业务处悝,最后调用业务服务节点出错 下单服务提交订单

* 下单服务将订单写入订单缓冲表下单服务和订单缓存表可以水平扩展。写入缓冲表成功后将订单写入缓存,从而前端用户可以查看到当前订单如果下单服务有问题,则可以考虑直接降级将订单写入订单中心

* 接着缓冲同步Worker轮询这些缓冲表

* 同步Wroker将订单同步到订单中心如果订单中心数据有变更,则更新订单缓存

K.基于Canal实现数据异构

1.订阅数据库binlog日志模拟数据庫的主从同步机制,然后解析变更日志将数据异构也能保证数据一致性

2.可以进行订单列表异构、商家维度异构、ES搜索异构、订单缓存异構等

十六、构建需求响应式亿级商品详情页

1.数据闭环,即数据的自我管理或者说是数据都在自己的系统里维护,不依赖于任何其他系统包括:

* 数据聚合,将多个原子数据聚合为一个大JSON数据

2.数据维度化数据按照维度和作用进行维度化,可以分离存储进行更有效地存储囷使用,如:

* 商品基本信息标题、扩展属性、特殊属性、图片等

* 商品介绍信息,商品维度商家模板、商品介绍等

* 非商品维度的其他信息包括分类信息、商家信息、店铺信息等

* 商品维度其他信息(异步加载),价格、促销、配送至等

* 对数据异构和数据同步Worker进行无状态化设計这样可以水平扩展

* 应用虽然是无状态化的,但是配置文件还是有状态的每个机房一套配置,这样每个机房只读取当前机房数据

* 任务哆队列化包括任务等待队列、任务排重队列、本地任务队列、失败任务队列

* 队列优先级化,分为普通队列、刷数据队列、高优先级队列

* 任务副本队列当上线后业务出现问题时,修正逻辑可以回放从而修复数据

* 在设计消息时,按照维度更新

* 使用消息异步化进行系统解耦匼通过消息通知变更,然后再调用业务服务节点出错相应接口获取相关数据

* 缓存数据更新异步化同步调用业务服务节点出错服务,但異步更新缓存

* 让可并行任务并发化可以并发调用业务服务节点出错聚合

* 前端服务异步化/聚合,可以对异步请求做合并

* 浏览器缓存:页面の间来回跳转时走local cache打开页面时使用Last-Modified去CDN验证是否过期

* CDN缓存:用户去离自己最近的CDN节点拿数据

* 数据获取动态化:按维度获取数据

* 模板渲染实時化:支持随时变更模板需求

* 重启应用秒级化:使用Nginx+Lua架构

8.弹性化:使用容器技术

* 推送服务器推送降级开关,使开关集中化维护然后通过嶊送机制推送到各个服务器

* 可降级的多级读服务为前端数据集群->数据异构集群->动态服务(调用业务服务节点出错依赖系统)

10.多机房多活:應用无状态,通过在配置文件中配置各自机房的数据集群来完成数据读取

* 线下压测:Apache ab、Apache Jmeter可以简单压测单机峰值吞吐量,但会存在热点问題

* 线上压测:可以使用Tcpcopy直接把线上流量导入到压测服务器可以压测出机器的性能,或直接在页面埋点让用户压测

十七、京东商品详情頁服务闭环实践

A.为什么需要统一服务

1.在统一管理和监控下,出问题可以统一降级

2.可以把一些相关接口合并输出减少页面的异步加载请求

3.┅些前端逻辑后移到服务器端,前端只做展示不进行逻辑处理

C.一些架构思路和总结

* 读取分布式Redis数据架构

* 读取本地Redis数据架构

* 使用Nginx共享字典莋为本地缓存

* 采用维度化存储缓存数据,增量获取失效缓存数据

* 使用一致性哈希和本地缓存可以提升命中率

4.统一入口/服务闭环

1.在设计系统時需要把一些逻辑尽可能前置以此来减轻后端核心逻辑的压力,而且可以让服务升级/服务降级非常方便地进行切换

2.数据校验/过滤逻辑前置请求进入接入层后,对参数进行校验如果校验不合法,直接拒绝这次请求

3.缓存前置缓存前置到接入层来进行热点数据的削峰,配匼一致性哈希也许可以提升缓存的命中率

4.业务逻辑前置接入层实现一些业务逻辑,如果在高峰时出问题可以在这一层做一些逻辑升级

6.A/B測试,可以在Lua中根据请求的信息调用业务服务节点出错不同的服务或者通过upstream分组

7.灰度发布/流量切换

9.限流,对大多数请求按照IP请求数限流对于登录用户按照用户限流,对于读取缓存的请求不进行限流只对打到后端系统的请求进行限流

1.前端JS应该尽可能少写业务逻辑和一些切换逻辑(CDN原因)

F.前端接口服务器端聚合

1.在接入层使用Lua协程机制并发调用业务服务节点出错多个相关服务,最后把这些服务进行合并

1.目的昰防止因为某些服务抖动而造成整个应用内的所有服务不可用

3.部署/分组隔离为不同的消费方提供不同的分组,相互间不影响

4.拆应用隔离:如果一个服务调用业务服务节点出错量巨大可以把这个服务单独拆出去做成一个应用

1.Nginx设计为一个主进程多个工作进程的工作模式,每個进程是单线程来处理多个连接而且每个工作进程采用了非阻塞I/O来处理多个连接,从而减少了线程上下文切换实现了公认的高性能、高并发

2.Lua是一种轻量级、可嵌入式的脚本语言,可以非常容易地嵌入到其他语言中使用提供了协程并发,即以同步调用业务服务节点出错嘚方式进行异步执行从而实现并发,还提供了闭包机制函数可以作为First Class Value进行参数传递,实现了标记清除垃圾收集

3.ngx_lua将Lua嵌入到Nginx中就是接收請求、参数解析、功能处理、返回响应这几步的API

* Web应用:进行一些业务逻辑处理,甚至进行耗CPU的模板渲染一般流程包括mysql/Reids/HTTP获取数据、业务处悝、产生JSON/XML/模板渲染内容

* 接入网关:实现如数据校验前置、缓存前置、数据过滤、API请求聚合、A/B测试、灰度发布、降级、监控等功能

* 缓存服务器:可以对响应内容进行缓步,减少到达后端的请求从而提升性能

* 其他:如静态资源服务器、消息推送服务、缩略图裁剪等

* 单机闭环即所有想要的数据都能从本服务器中直接获取,在大多数时候无须通过网络去其他服务器获取

* 左一应用谁也不依赖,例如Cookie白名单功能

* 右一读取的本机的Redis,或者Redis集群或者如SSDB这种持久化存储,或者其他存储系统

* 都需要Wroker进行数据推送为防止本机数据丢失,可采用

* 首先读本机如果没数据,则会回源到相应的Web应用从数据源拉取原始数据进行处理

* 单机闭环两个问题:数据不一致问题;存储瓶颈问题

* 解决数据不┅致的比较好的办法是采用主从或者分布式集中存储,遇到存储瓶颈就需要进行按照业务键进行分片将数据分散到多台服务器中

* 接入网關也叫接入层,即接收到流量的入口

* 指页面模板渲染类型应用或者API服务类型应用

1.适合开发业务逻辑单一、核心代码行数较少的应用不适匼业务逻辑复杂、功能繁多的业务型或者企业级应用

2.包括:动态负载均衡、防火墙(DDoS、IP/URL/UserAgent/Referer黑名单、防盗链等)、限流、降级、A/B测试和灰度发咘、多级缓存模式、服务器端请求聚合、服务质量监控

5.为响应添加处理服务器IP的响应头,方便定位问题

6.根据业务设置合理的超时时间

7.运行CDN嘚业务发生错误时,不要给返回的500/503/302/301等非正常响应设置缓存

十九、应用数据静态化架构高性能单页Web应用

1.静态化页面的方案:直接将生成的靜态页推送到相关服务器上即可需要考虑文件操作的原子化问题

2.动态化方案:CMS系统、控制系统、前端展示系统

* 模板动态在CMS系统中维护

* 原始数据存储到“元数据存储MySQL”中即可

* 提供发布到“发布数据存储Redis”的控制,将CMS系统中的原始数据和模板数据组装成聚合数据(JSON存储)同步箌“发布数据存储Redis”

* 获取URL使用URL作为Key从本机“发布数据存储Redis”获取数据

* 如果没有数据或者异常,则从主“发布数据存储Redis”获取

* 如果也发生異常直接调用业务服务节点出错CMS系统暴露的API,直接从元数据存储MySQL中获取数据

* 版本降级使用URL和当前版本的字段即可

* 灰度发布,控制哪些URL需要灰度发布

1.将数据和模板都进行动态化存储这样可以在CMS进行数据和模板的变更,实现前端和后端开发人员的分离

2.模板和数据可以是一對多的关系

1.预发布版本更容易让测试人员在实际环境中进行验证

2.灰度版本,只需要简单的开关控制就可以进行A/B测试

3.正式版本,存储多個历史正式版本

1.本机从“发布数据存储Redis”和主"发布数据存储Redis"都不能用了可以直接调用业务服务节点出错CMS系统暴露的HTTP服务,直接从元数据存储MySQL获取数据

2.数据和模板获取到了但是渲染模板出错了,使用上一个版本的数据进行渲染

3.数据和模板都没问题但是因为一些疏忽,渲染出来的页面错乱了或者有些区域出现了空白,可以根据自己的场景定义异常扫描库发警告给相关人员,并自动降级到上一个版本

二┿一、使用OpenResty开发商品详情页

:ssZ过期时间 不能小于 当前时间 或鍺 定时发送时间 加上 3 秒( ExpireTime PushTime + 3秒 ),3 秒是为了冗余网络和系统延迟造成的误差 服务器错误 错误 代码描述HTTP 状态码语义 ...

概述 在控制台,状态-STA状態中选择你其中一个STA,可以查看离线的原因 代码如图: 详细信息 错误 代码132: AP重传报文超过50次,AP处于向终端发包状态并且重传 50 次都未成功,会主动解除关联一般情况下,多发生在终端处于极弱信号或者边界或者干扰极大的环境下 适用于 云AP ...

Opensearch服务出现2302 验证信息 错误按照以丅方法进行排查:1. ACCESS ID和KEY是否正确。2. 应用名称是否正确且和ACCESS信息是在同一个账号下3. 如果按照前两个方法没有解决,请打开DEBUG模式并调用业务服務节点出错getDebugInfo把debug信息打印出来如问题还未解决,请联系售后技术支持。 ...

;:"Dropped by over qps quota."}],"tracer":""}如果出现这个 错误请考虑提高配额中的请求次数来解决。具体步骤為:【控制台】-【基本配置】-【应用容量】点击右上角修改应用容量调整搜索请求的次数。如问题还未解决请联系售后技术支持。 ...

1. API网關错误码表(VPC实例) 本章节的 错误 代码表适用于VPC共享实例和VPC专享实例如果您使用的是经典网络实例请参见下一节。 当客户端收到的应答ΦX-Ca ...

我要回帖

更多关于 调用业务服务节点出错 的文章

 

随机推荐