前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >与慢速设备通讯异步化方案

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

作者头像
一见
发布2018-08-10 17:10:41
3890
发布2018-08-10 17:10:41
举报
文章被收录于专栏:蓝天蓝天

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

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

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

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

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

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

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

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

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

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

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

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

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

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

代码语言:javascript
复制
 	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连接有绑定关系,同一个连接不支持多个并发的事务。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014-06-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档