异步处理
在分布式系统中的优化作用
QCon Beijing /
异步处理
单机数据库时代
Database
Server
Client
异步处理
单机数据库时代
DbConnection conn = new DbConnection(IPAddress);
DbResult res = (Query);
();
异步处理
大数据时代
Database
1
Client
Database
2
异步处理
代码写法1:
串行同步
DbResult res1 = (Query1);
DbResult res2 = (Query2, res1);
();
异步处理
代码写法2:
并行同步
DbResult (res1, res2) =
ExecParallelQuery(conn1, Query1, conn2, Query2);
formatAndOutput(res1, res2);
异步处理
串行还是并行?
函数调用把并行处理的可能性大大降低:
function getResult() {
DbConnection conn = new DbConnection(IPAddress);
DbResult res = (Query);
return res;
}
异步处理
代码写法3:
异步
DbConnection conn = new DbConnection(IPAddress);
Future<DbResult> res = (Query);
异步处理
异步写法不怕函数调用
function getResult1() {
DbConnection conn = new DbConnection(IPAddress);
Future<DbResult> res = (Query);
yield return res;
}
异步处理
异步写法有传染性
function getResult1() {
DbConnection conn = new DbConnection(IPAddress);
Future<DbResult> res = (Query);
yield return res;
}
function getResult2() {
DbResult res1 = waitFor(getResult1());
yield return res1;
}
异步处理
Facebook
全异步写法
PHP
加入
yield
和 generator
功能
组成
Distributed
Query
执行
Distributed
Query
异步处理
实例
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);
异步处理
两行代码同时考虑呢?
Friends Porche
Buyers
SELECT
*
FROM
friends
f
INNER
JOIN
porche_buyers
b
ON
=
异步处理
多机时代的数据库问题
如何组成
Distributed
Query
如何执行
Distributed
Query