[转载QCON] 异步处理 在分布式系统中的优化作用

单机数据库时代

在这里插入图片描述

 DbConnection conn = new DbConnection(IPAddress);
 DbResult res = conn.exec(Query);
 res.display();

大数据时代

在这里插入图片描述

  • 代码写法1: 串行同步
 DbResult res1 = conn1.exec(Query1);
 DbResult res2 = conn2.exec(Query2, res1);
 res2.display();
  • 代码写法2: 并行同步
 DbResult (res1, res2) = ExecParallelQuery(conn1, Query1, conn2, Query2);
 formatAndOutput(res1, res2);
- 串行还是并行?
- 函数调用把并行处理的可能性大大降低:
function getResult() {
	DbConnection conn = new DbConnection(IPAddress); 
	DbResult res = conn.exec(Query);
	return res;
}
  • 代码写法3: 异步
  DbConnection conn = new DbConnection(IPAddress);
  Future<DbResult> res = conn.asyncExec(Query);
- 异步写法不怕函数调用
function getResult1() {
	DbConnection conn = new DbConnection(IPAddress); 
	Future<DbResult> res = conn.asyncExec(Query); 
	yield return res;
}
- 异步写法有传染性
function getResult1() {
	DbConnection conn = new DbConnection(IPAddress); 
	Future<DbResult> res = conn.asyncExec(Query); 
	yield return res;
}
 function getResult2() {
    DbResult res1 = waitFor(getResult1());
    yield return res1;
}
- Facebook 全异步写法

在这里插入图片描述

实例

  • 错误的代码
找出朋友中在淘宝上买过东西的人:
  IdList friends = waitFor(getFriends(myId));
  yield return getTaoBaoBuyers(friends);
找出朋友中在淘宝上买过保时捷的人?

上面的代码:在写第一行代码时已经错了!

  • 正确的代码
找出朋友中在淘宝上买过东西的人:
  IdList friends = waitFor(getFriends(myId));     ----❌
  yield return getTaoBaoBuyers(friends);     ----❌
找出朋友中在淘宝上买过保时捷的人:
  IdList buyers = waitFor(getPorscheBuyer());     ----✅
  yield return getFriends(buyers);     ----
  • 两行代码同时考虑呢?
    在这里插入图片描述

多机时代的数据库问题

在这里插入图片描述

发布了77 篇原创文章 · 获赞 55 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/langhailove_2008/article/details/89846686