一、什么是DRPC
RPC (Remote Procedure Call Protocol)——远程过程调用协议
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
Distributed RPC ——分布式远程过程调用协议
DRPC就是分布式RPC,Storm是一个分布式实时流处理框架,因此我们称它是建立在Strom之上并行计算的RPC架构。Storm DRPC就是客户端发送请求,发送给Strom Topology,经过Storm处理后将客户端所请求的结果返回给客户端,这里我们可以理解为一般的RPC调用。
Storm里面引入DRPC主要是利用 Storm的实时计算能力来并行化CPU密集型( CPU Intensive)的计算任务。DRPC的 Storm Topology以函数的参数流作为输入,而把这些函数调用的返回值作为 Topology的输出流。
DRPC服务器协调:
① 接收一个RPC请求
② 发送请求到storm topology
③ 从storm topology接收结果
④ 把结果发回给等待的客户端
DRPC把大量请求分布式的去做,一次请求如果串行的话可能会比较慢,我并行的来处理,另一方面通过来降低平均一次请求的时间,解决了响应的吞吐,如下图所示:
二、DRPC示例(本地模式)
代码如下:
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package storm.starter;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.LocalDRPC;
import backtype.storm.drpc.DRPCSpout;
import backtype.storm.drpc.ReturnResults;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
public class ManualDRPC {
public static class ExclamationBolt extends BaseBasicBolt {
@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("result", "return-info"));
}
@Override
public void execute(Tuple tuple, BasicOutputCollector collector) {
String arg = tuple.getString(0);
Object retInfo = tuple.getValue(1);
collector.emit(new Values(arg + "!!!", retInfo));
}
}
public static void main(String[] args) {
TopologyBuilder builder = new TopologyBuilder();
LocalDRPC drpc = new LocalDRPC();
DRPCSpout spout = new DRPCSpout("exclamation", drpc);
builder.setSpout("drpc", spout);
builder.setBolt("exclaim", new ExclamationBolt(), 3).shuffleGrouping("drpc");
builder.setBolt("return", new ReturnResults(), 3).shuffleGrouping("exclaim");
LocalCluster cluster = new LocalCluster();
Config conf = new Config();
cluster.submitTopology("exclaim", conf, builder.createTopology());
System.out.println(drpc.execute("exclamation", "aaa"));
System.out.println(drpc.execute("exclamation", "bbb"));
}
}
执行结果如下:
三、DRPC示例(集群模式)
1、修改每台服务器上的配置文件/home/apache-storm-0.9.4/conf/storm.yaml
2、启动DRPC服务
在每台服务器上执行如下命令
cd /home/apache-storm-0.9.4
./bin/storm drpc >> ./logs/drpc.out 2>&1 &
等待DRPC启动成功之后再执行如下命令
bin/storm jar examples/storm-starter/storm-starter-topologies-0.9.4.jar storm.starter.BasicDRPCTopology basicDRPC
出现下图所示代表提交成功
查看UI界面,发现任务已经上去了。
在执行main方法,调用DRPC获取结果,代码如下:
import backtype.storm.utils.DRPCClient;
/**
* Created by ZhangJintao on 2020/3/5.
*/
public class Test {
public static void main(String[] args) {
DRPCClient drpcClient = new DRPCClient("node1", 3772);
try {
String result = drpcClient.execute("exclamation", "abcd");
System.out.printf("result = " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果如下: