上班打发 2013-05-02
1.模拟简单的压力测试环境:
Client端10s提交一个job
Worker端处理一个job需要30s的时间
Client端一直提交job,当大量job堆积时对Gearman进行压力测试
2.Gearman-Java压力测试demo
client端代码:
import java.util.Date; import org.gearman.Gearman; import org.gearman.GearmanClient; import org.gearman.GearmanServer; public class ReverseClient { public static void main(String[] args) throws InterruptedException { // 创建一个Gearman实例 Gearman gearman = Gearman.createGearman(); // 创建一个Gearman client GearmanClient client = gearman.createGearmanClient(); /* * 创建一个jobserver * * Parameter 1: job server的IP地址 Parameter 2: job server监听的端口 * * job server收到client的job,并将其分发给注册worker * */ GearmanServer server = gearman.createGearmanServer( ReverseWorker.ECHO_HOST, ReverseWorker.ECHO_PORT); // 告诉客户端,提交工作时它可以连接到该服务器 client.addServer(server); /* * 向job server提交工作 * * Parameter 1: gearman function名字 Parameter 2: 传送给job server和worker的数据 * * GearmanJobReturn返回job发热结果 */ // 压力测试,客户端10s提交一个job int count = 1; while (true) { System.out.println(new Date() + ":第" + count + "个任务正在提交..."); client.submitJob( ReverseWorker.ECHO_FUNCTION_NAME, ("第" + count + "个任务").getBytes()); count ++ ; try { Thread.sleep(10000); } catch (Exception e) { e.printStackTrace(); } } // 关闭 // gearman.shutdown(); } }
worker端代码:
package test; import java.util.Date; import org.gearman.Gearman; import org.gearman.GearmanFunction; import org.gearman.GearmanFunctionCallback; import org.gearman.GearmanServer; import org.gearman.GearmanWorker; public class ReverseWorker implements GearmanFunction { // function name public static final String ECHO_FUNCTION_NAME = "reverse"; // job server地址 public static final String ECHO_HOST = "192.168.125.131"; // job server监听的端口 public static final int ECHO_PORT = 4730; public static void main(String[] args) { // 创建一个Gearman实例 Gearman gearman = Gearman.createGearman(); /* * 创建一个jobserver * * Parameter 1: job server的IP地址 Parameter 2: job server监听的端口 * * job server收到client的job,并将其分发给注册worker * */ GearmanServer server = gearman.createGearmanServer( ReverseWorker.ECHO_HOST, ReverseWorker.ECHO_PORT); // 创建一个Gearman的worker GearmanWorker worker = gearman.createGearmanWorker(); // 告诉工人如何执行工作(主要实现了GearmanFunction接口) worker.addFunction(ReverseWorker.ECHO_FUNCTION_NAME, new ReverseWorker()); // worker连接服务器 worker.addServer(server); } @Override public byte[] work(String function, byte[] data, GearmanFunctionCallback callback) throws Exception { // work方法实现了GearmanFunction接口中的work方法,worker端30s处理一个方法 if (data != null) { String str = new String(data); try { Thread.sleep(30000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(new Date() + ":" +str + "处理完成"); return (str + "处理完成").getBytes(); } else { return "未接收到data".getBytes(); } } }
show tables;就可以看到下面多了个“gearman_queue”的表。也就是说,如果一个mysql的连接,超过28800s没有任何响应,就会断开。或者,干脆直接放弃用mysql的持久化方式。