集群通信组件tribes之通道拦截器

简介: 拦截器应该可以说是一个很经典的设计模式,它有点类似于过滤器,当某信息从一个地方流向目的地的过程中,可能需要统一对信息进行处理,如果考虑到系统的可扩展性和灵活性通常就会使用拦截器模式,它就像一个个关卡被设置在信息流动的通道中,并且可以按照实际需要添加和减少关卡。

拦截器应该可以说是一个很经典的设计模式,它有点类似于过滤器,当某信息从一个地方流向目的地的过程中,可能需要统一对信息进行处理,如果考虑到系统的可扩展性和灵活性通常就会使用拦截器模式,它就像一个个关卡被设置在信息流动的通道中,并且可以按照实际需要添加和减少关卡。Tribes为了在应用层提供对源消息统一处理的渠道引入通道拦截器,用户在应用层只需要根据自己需要添加拦截器即可,例如,压缩解压拦截器、消息输出输入统计拦截器、异步消息发送器等等。

拦截器的数据流向示意图可以参考前面的tribes简介章节,数据从IO层流向应用层,中间就会经过一个拦截器栈,应用层处理完就会返回一个ack给发送端表示已经接收并处理完毕(消息可靠级别为SYNC_ACK),下面尝试用最简单一些代码和伪代码说明tribes的拦截器实现,旨在领会拦截器如何设计而并非具体的实现。最终实现的功能如图所示,最底层的协调者ChannelCoordinator永远作为第一个加入拦截器栈的拦截器,往上则是按照添加顺序排列,且每个拦截器的previousnext分别指向前一个拦截器和下一个拦截器。

 

① 定义拦截器接口

public interface ChannelInterceptor{

    public void setNext(ChannelInterceptor next) ;

    public ChannelInterceptor getPrevious();

    public void sendMessage(ChannelMessage msg);

    public void messageReceived(ChannelMessage msg);

}

② 定义一个基础拦截器,提供一些公共的操作,由于拦截器执行完后要触发下个拦截器,所以把触发工作统一抽离到基础类里面完成,当然里面必须包含前一个和后一个拦截器的引用。

public class ChannelInterceptorBase implements ChannelInterceptor {

    private ChannelInterceptor next;

    private ChannelInterceptor previous;

    public ChannelInterceptorBase() {

    }

    public final void setNext(ChannelInterceptor next) {

        this.next = next;

    }

    public final ChannelInterceptor getNext() {

        return next;

    }

    public final void setPrevious(ChannelInterceptor previous) {

        this.previous = previous;

    }

    public final ChannelInterceptor getPrevious() {

        return previous;

    }

    public void sendMessage(ChannelMessage msg) {

        if (getNext() != null) getNext().sendMessage(msg,);

    }

    public void messageReceived(ChannelMessage msg) {

        if (getPrevious() != null) getPrevious().messageReceived(msg);

    }

}

③ 压缩解压拦截器,此拦截器负责按一定算法压缩和解压处理。

public class GzipInterceptor extends ChannelInterceptorBase {

    public void sendMessage(ChannelMessage msg){

            compress the msg;

            getNext().sendMessage(msg);

    }

    public void messageReceived(ChannelMessage msg) {

            decompress the msg;

            getPrevious().messageReceived(msg);

    }

}

④ 最底层的协调器,直接与网络IO做交互

public class ChannelCoordinator extends ChannelInterceptorBase{

    public ChannelCoordinator() {

    }

    public void sendMessage(ChannelMessage msg) throws ChannelException {

        Network IO Send

    }

public void messageReceived(ChannelMessage msg) {

    Network IO READ

        super.messageReceived(msg);

    }

}

⑤ 测试类

public class Test{

public void main(String[] args){

ChannelCoordinator coordinator = new ChannelCoordinator();

GzipInterceptor gzipInterceptor = new GzipInterceptor();

coordinator.setNext(null);

coordinator.setPrevious(gzipInterceptor);

gzipInterceptor.setPrevious(null);

gzipInterceptor .setNext(coordinator);

gzipInterceptor.sendMessage(msg);

coordinator.messageReceived(msg);

}

    Tribes的拦截器整体设计就如上面,整个拦截器的执行顺序如下,当执行写操作时,数据流向GzipInterceptor -> ChannelCoordinator -> Network IO;当执行读操作时,数据流向则为Network IO -> ChannelCoordinator -> GzipInterceptor。理解了整个设计原理后对于tribes的整体把握将会更加深入。


点击订购作者《Tomcat内核设计剖析》



目录
相关文章
|
关系型数据库 MySQL Java
【面试题精讲】MySQL-长连接和短连接
【面试题精讲】MySQL-长连接和短连接
LangChain-03 astream_events 流输出
LangChain-03 astream_events 流输出
165 3
|
存储 人工智能 分布式计算
阿里云智能大数据演进
本文根据7月24日飞天发布时刻产品发布会、7月5日DataFunCon2024·北京站:大数据·大模型.双核时代实录整理而成
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的反诈科普平台的详细设计和实现
基于SpringBoot+Vue+uniapp的反诈科普平台的详细设计和实现
287 7
基于SpringBoot+Vue+uniapp的反诈科普平台的详细设计和实现
|
Java 数据库连接 Spring
如何在IDEA中自定义模板、快速生成完整的代码?
这篇文章介绍了如何在IntelliJ IDEA中使用easycode插件自定义代码生成模板,以快速生成Spring Boot、MyBatis等项目中常见的Controller、Service、Dao、Mapper等组件的代码。
如何在IDEA中自定义模板、快速生成完整的代码?
|
机器学习/深度学习 自然语言处理 搜索推荐
探索文本向量化的新高峰:合合信息acge_text_embedding 模型原创
文本向量化方法包括词袋模型、TF-IDF、词嵌入和预训练模型(如BERT、GPT)。词嵌入如Word2Vec、GloVe和FastText捕捉单词语义,预训练模型则保留上下文信息。C-MTEB是中文文本嵌入评估平台,测试模型在检索、相似性、分类等任务的性能。合合信息的acge_text_embedding模型在C-MTEB中表现优秀,适用于情感分析、文本生成等任务,具有高分类聚类准确性、资源效率和场景适应性。技术突破涉及数据集优化、模型训练策略和持续学习,提供Demo展示如何使用acge模型计算句子相似度。acge_text_embedding是提升文本处理效率和智能化的有力工具。
1343 2
探索文本向量化的新高峰:合合信息acge_text_embedding 模型原创
|
Java
Java 计算两个时间点包含工作日天数【拿来即用】
Java 计算两个时间点包含工作日天数【拿来即用】
510 0
|
存储 关系型数据库 MySQL
MySQL中的DISTINCT与GROUP BY:效率之争与实战应用
【8月更文挑战第12天】在数据库查询优化中,DISTINCT和GROUP BY常常被用来去重或聚合数据,但它们在实现方式和性能表现上却各有千秋。本文将深入探讨两者在MySQL中的效率差异,结合工作学习中的实际案例,为您呈现一场技术干货分享。
1144 0
|
消息中间件 存储 Java
RabbitMQ之延迟队列(手把手教你学习延迟队列)
【1月更文挑战第12天】延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列的。
4710 108
|
算法 搜索推荐 开发者
解锁Python代码的速度之谜:性能瓶颈分析与优化实践
探索Python性能优化,关注解释器开销、GIL、数据结构选择及I/O操作。使用cProfile和line_profiler定位瓶颈,通过Cython减少解释器影响,多进程避开GIL,优化算法与数据结构,以及借助asyncio提升I/O效率。通过精准优化,Python可应对高性能计算挑战。【6月更文挑战第15天】
1980 1