与慢速设备通讯异步化方案

与慢速设备通讯异步化方案.pdf像MySQL、被对接的银行系统等,都可称作慢速设备。它们的共同特点是只提供了同步调用接口,而且响应通常会比较慢。

一般业务系统在业务线程或进程中,直接调用它们提供的API进行访问,如下图所示:

结果造成了以下两大问题:

1) 性能低:同步阻塞方式;

2) 可靠性差:业务系统和慢速设备强耦合。

性能低,是因为慢速设备不能快速响应返回结果;可靠性差,是因为业务系统和慢速设备没有解耦合,比如当慢速设备的API因异常被长时间挂起时,会导致业务系统的线程或进程也一同被挂起。

要解决性能低,就需要异步化,也就是业务系统可异步访问慢速设备;要解决可靠性差,就需要两者间解耦合。

下图所示的方案,针对这两个问题进行了优化,即实现了异步化,也做到了解耦合:

以MySQL为例,业务系统在向MySQL发起SQL操作时,不再直接调用MySQL的API,而是将SQL放入到队列中,然后立即返回。

针对每一个MySQL实例,都会有一个侍服线程,与它建立一对一对绑定关系,也就是这个线程专门为它服务的,如果有多个MySQL实例,则有相应个数的侍服线程,侍服线程不会跨MySQL实例。

侍服线程会实时监听队列,当有数据时,立即取出来,然后调用MySQL的API执行SQL操作,这个过程是同步的,侍服线程会阻塞,直到MySQL返回结果。

对于MySQL返回的结果,有两种业务系统的方式:一是由侍服线程回调业务,对结果的处理权在侍服线程;二是将结果存入结果队列,然后业务可以以epoll的方式取出结果,这种方式可以让对结果的处理权回归到业务线程。

1) 侍服线程回调业务实现方式

下面以伪代码方式,展现实现方式:

 	void mysql_thread() 
 	{ 
 	while (true) 
 	{ 
 	sql = _sql_queue.pop(); // 阻塞等待队列中有SQL,如果有,则取出SQL 
 	result = mysql.query(sql); // 调用MySQL接口,进行SQL操作,结果存在result中 
 	service->callback(result); // 回调业务接口,让业务对结果进行处理 
 	} 
 	} 

2) 以epoll的方式取出结果

这种方式让对结果的处理权回归到业务线程。实现方式非常简单,只需要结果队列是可以epoll的即可,通常可以借助eventfd或pipe来包装一个队列,让这队列可以epoll监听。侍服线程只需要将结果存入结果队列,然后会自动唤醒处于等待状态的epoll。

异步化方案不能支持事务,关键原因是事务和MySQL连接有绑定关系,同一个连接不支持多个并发的事务。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Django中文社区

前言

Django 是使用 Python 编写的一个开源 Web 框架,可以用它来快速搭建一个高性能的网站。 Django makes it easier to b...

2886
来自专栏ml

javaSE基础之记事本编程

     首先安装好jdk和jre,之后进行如下操作:           1. 将代码记事本----》cmd--->javac 文件名.java ----->...

3087
来自专栏专注数据中心高性能网络技术研发

Chrome插件Tampermonkey--自定义过滤百度网页搜索结果并去除广告栏和自动推荐

1.目的 过滤百度搜索的种种无内涵、低信息量、低质量的网页。 ---- 2.所需工具 浏览器:Chrome 插件:Tampermonkey  自定义脚本: ? ...

5865
来自专栏张戈的专栏

借助腾讯云CDN开启全站https及问题解决分享

“眼尖”的朋友,已经看到张戈博客已全面启用 https 了,当然这几天站点 502 也是常用的事情。不过到我写这篇文章为止,应该算是安定了下来。 自从百度推荐全...

5965
来自专栏木子昭的博客

webpack多入口多出口的实现

对古老的网站进行维护, 短时间内用react或vue组件化重写全部页面不太现实,但用webpack做个打包, 还是可行性的, 配置好webpack多入口多出口,...

1814
来自专栏菩提树下的杨过

Asp.Net4.0/VS2010新变化(5):可扩展的(分布式)缓存

.net3.0/3.5时代,asp.net的outPut缓存默认只能存放于内存中,但是内存资源是有限的,这就导致了缓存的无法扩展。 而asp.net4.0中允...

1885
来自专栏AILearning

Github 组织( organization ) 账号的申请和转换

组织(organization)账号:    类似一个公司, 此账号就无需登录[也没法登录啦],需要找到一个owner来管理它    我们可以添加owner,类...

2707
来自专栏性能与架构

JS模块化开发的价值

非模块化方式开发的痛苦 (1)命名冲突 起初,我们定义了一个通用功能的JS文件,例如 utils.js(其中有一个 each 函数),谁需要谁调用即可 但随着项...

3044
来自专栏张戈的专栏

Linux操作系统DNS解析(nameserver)监控脚本

一、起因 昨天,开发组兄弟发现 resin 日志出现不少支付宝业务报错信息,用户用支付宝购买了产品,钱到账后公司系统却未返回支付成功状态! 这还得了?用户明明支...

4154
来自专栏Java帮帮-微信公众号-技术文章全总结

Linux查看日志命令【面试+工作】

2864

扫码关注云+社区

领取腾讯云代金券