kafka 由于它自身的高性能发送与消费能力,而受到广大企业的喜欢,所以我们就先看看kafka 一些源码实现如下:  

  public void run() {
int messageNo = 1;
while (true) {
String messageStr = "Message_" + messageNo;
long startTime = System.currentTimeMillis();
if (isAsync) {
producer.send(new ProducerRecord<>(topic,
messageNo,
messageStr), new DemoCallBack(startTime, messageNo, messageStr));// 异步发送
} else {
try {
producer.send(new ProducerRecord<>(topic,
messageNo,
messageStr)).get();// 同步发送
System.out.println("Sent message: (" + messageNo + ", " + messageStr + ")");
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
++messageNo;
}
}

  这段代码摘抄的是,kafka源码 生产者发送消息demo(kafka.examples.Producer) 里面的一个片段,主要是涉及到两个知识点,一个是异步发送消息,

回调函数的实现,另一个就是同步发送,多线程Future.get 模式的实现。现在分别阐述这两种实现方式。

  异步回调方式

  其实这种方式主要应用在调用多线程执行某个任务时,不用傻傻等到该线程完成后得到相应的反馈信息。举个例子Client端需要调用Server端来执行某个任务,并且希望Server端执行完成后

主动将相应的结果告诉Client端。这个过程就叫做回调了。如下代码:

  

 public class Client implements CSCallBack {

     private volatile boolean stopThread = false;
private Server server; public Client(Server server) {
this.server = server;
} public void sendMsg(final String msg){
System.out.println("ThreadName="+Thread.currentThread().getName()+" 客户端:发送的消息为:" + msg);
new Thread(new Runnable() {
@Override
public void run() {
server.getClientMsg(Client.this,msg);// 核心代码1:将被调用方自己当作参数(client)传递到调用方(Server) while(!stopThread) {// 模拟等待另服务器端代码完成
System.out.println("ThreadName="+Thread.currentThread().getName()+"客户端:模拟等待回调完成"); try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
System.out.println("ThreadName="+Thread.currentThread().getName()+" 客户端:异步发送成功");
} @Override
public void process(String status) {
stopThread = true;
System.out.println("ThreadName="+Thread.currentThread().getName()+" 客户端:收到服务端回调状态为:" + status);
}
}
 public class Server {

     public void getClientMsg(CSCallBack csCallBack , String msg) {

         // 模拟服务端需要对数据处理
try {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("ThreadName="+Thread.currentThread().getName()+" 服务端:服务端接收到客户端发送的消息为:" + msg);
while(true) {
int max=10,min=1;
int ranNum = (int) (Math.random()*(max-min)+min); if(ranNum >6) {// 当随机数大于5时认为任务完成
System.out.println("ThreadName="+Thread.currentThread().getName()+" 服务端:数据处理成功,返回成功状态 200");
String status = "200";
csCallBack.process(status);// 核心代码2:调用方(Server)任务处理完成相应的任务后,调用被调用方(Client)的方法告知任务完成
break;
} try {
Thread.sleep(80);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start(); } catch (Exception e) {
e.printStackTrace();
} }
}

其实核心代码就两个:

      client端:被调用方自己当作参数(client)传递到调用方(Server)。

      Server端:调用方(Server)任务处理完成相应的任务后,调用被调用方(Client)的方法告知任务完成。

   同步发送多线程 Future.get 模式实现 

        这种方式方式主要是用来等待某一项任务完成后,接着顺序执行某项任务。和上面的例子一样都是client 端 向server 端请求完成某项任务,并且期望server 端在完成任务后,返回结果

  实例代码如下:

  

 public class FutureDemo {

     protected RealData realdata = null;
protected boolean isReady = false;
public synchronized void requestData(RealData realdata) {// client请求server完成某项任务
if (isReady) {
return;
}
this.realdata = realdata;
isReady = true;
notifyAll();//核心代码2:当请求的任务处理完成时,唤醒等待中的线程
} public synchronized String getResult() {// client等待server完成任务后返回,此处就相当于 Future.get
while (!isReady) {
try {
wait();//核心代码1:发出请求后等待线程被激活
} catch (InterruptedException e) {
}
}
return realdata.result;
}
}

  核心实现代码其实就是多线程里面的,wait 和 notify 实现方式。异步回调 和 同步 Future get 模式最大的区别,举个例子吧,

老婆(client 端)很爱老公,老公(服务器端)每天完成加班很晚,老婆都会等到老公回家然后给他做夜宵(同步 Future get 模式)

          老婆(client 端)很爱老公,老公(服务器端)每天完成加班很晚,老婆觉得一直等太累了,就先睡觉,等老公回来后通知老婆(回调),然后老婆再给老公做夜宵(异步回调方式)。

所以大家都期望自己的老婆是, Future get 模式 还是 异步回调模式?

              

            

看源码学编程系列之kafka(一)的更多相关文章

  1. Android 看源码学 Binder

    参考:https://jekton.github.io/2018/04/07/binder-why-RemoteListenerCallback-works/ 参考:https://jekton.gi ...

  2. 没必要看源码。。把文档学通就已经牛逼了(我们大多还是在应用层,还达不到研究的程度。附class与examples大全链接)

    [学霸]深圳-鑫 2017/7/11 13:54:07只是学习怎么用QT的话,不用看源码.看帮助文档就很好要学习编码风格与思路,就看看源码 [学神]武汉-朝菌 2017/7/11 13:54:39没必 ...

  3. Mybatis源码详解系列(三)--从Mapper接口开始看Mybatis的执行逻辑

    简介 Mybatis 是一个持久层框架,它对 JDBC 进行了高级封装,使我们的代码中不会出现任何的 JDBC 代码,另外,它还通过 xml 或注解的方式将 sql 从 DAO/Repository ...

  4. kafka producer 概要(看源码前,最好能掌握)

        kafakproducer概要(看源码前,最好能理解) 摘要 kafak 被设计用来作为一个统一的平台来处理庞大的数据的实时工具,在设计上有诸多变态的要求 它必须具有高吞吐量才能支持大量事件流 ...

  5. [从源码学设计]蚂蚁金服SOFARegistry之程序基本架构

    [从源码学设计]蚂蚁金服SOFARegistry之程序基本架构 0x00 摘要 之前我们通过三篇文章初步分析了 MetaServer 的基本架构,MetaServer 这三篇文章为我们接下来的工作做了 ...

  6. [从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作

    [从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作 目录 [从源码学设计]蚂蚁金服SOFARegistry之网络封装和操作 0x00 摘要 0x01 业务领域 1.1 SOFARegis ...

  7. [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用

    [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 目录 [从源码学设计]蚂蚁金服SOFARegistry之时间轮的使用 0x00 摘要 0x01 业务领域 1.1 应用场景 0x02 定 ...

  8. 30s源码刨析系列之函数篇

    前言 由浅入深.逐个击破 30SecondsOfCode 中函数系列所有源码片段,带你领略源码之美. 本系列是对名库 30SecondsOfCode 的深入刨析. 本篇是其中的函数篇,可以在极短的时间 ...

  9. [从源码学设计]蚂蚁金服SOFARegistry之消息总线

    [从源码学设计]蚂蚁金服SOFARegistry之消息总线 目录 [从源码学设计]蚂蚁金服SOFARegistry之消息总线 0x00 摘要 0x01 相关概念 1.1 事件驱动模型 1.1.1 概念 ...

随机推荐

  1. 非阻塞IO模型

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> # ...

  2. c#菜单动态合并

    说明 在程序中经常使用弹出菜单,并且一个窗体中可以存在多个弹出菜单.开发过MDI窗体的读者可能都知道,当MDI子窗体最大化时,子窗体和主窗体的菜单能够自动的合并.这是如何实现的呢?本例实现了将两个弹出 ...

  3. 压敏电阻的保护作用—NDF达孚电子科技

    压敏电阻是常见的电子元器件之一,它的保护作用被大家熟知和运用.压敏电阻的主要用于在电路承受过压时进行电压钳位,吸收多余的电流以保护灵敏器件.压敏电阻的导电特性随着施加电压的变化呈非线性变化,它能保护电 ...

  4. 百万年薪python之路 -- 迭代器

    3.1 可迭代对象 3.1.1 可迭代对象定义 **在python中,但凡内部含有 _ _ iter_ _方法的对象,都是可迭代对象**. 3.1.2 查看对象内部方法 该对象内部含有什么方法除了看源 ...

  5. C++ 构造函数的执行过程(一) 无继承

      引言 C++ 构造函数的执行过程(一) 无继承 本篇介绍了在无继承情况下, C++构造函数的执行过程, 即成员变量的构建先于函数体的执行, 初始化列表的数量和顺序并不对构造函数执行顺序造成任何影响 ...

  6. 设计模式(三)Template Method模式

    在父类中定义处理流程的框架,在子类中实现具体处理的模式就称为Template Method模式即模板方法模式. 根据下面的示例程序理解模板方法模式. package BigJunOba.bjtu.Te ...

  7. js中用面向对象的思想——淡入淡出轮播图

    首先看下效果图 明确功能 1.前后切换(边界判断) 2.按键切换  3.自动轮播 css代码 <style> * {margin:0; padding:0;} li{list-style: ...

  8. SpringBoot整合MybatisPlus3.X之乐观锁(十三)

    主要适用场景 意图: 当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式: 取出记录时,获取当前version 更新时,带上这个version 执行更新时, set version = ...

  9. MySQL数据库的安装与配置(windows)

    MySQL是目前最为流行的开放源码的数据库,是完全网络化的跨平台的关系型数据库系统,它是由瑞典MySQLAB公司开发,目前属于Oracle公司.任何人都能从Internet下载MySQL软件,而无需支 ...

  10. MySQL的统计信息学习总结

    统计信息概念 MySQL统计信息是指数据库通过采样.统计出来的表.索引的相关信息,例如,表的记录数.聚集索引page个数.字段的Cardinality.....MySQL在生成执行计划时,需要根据索引 ...