大家好,我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为职业八股文选手

我又又又又被吐槽了,随之而来,我的消息推送平台开源项目Austin又又又又更新啦,迭代自己的项目多是一件美事啊

源码Gitee链接:gitee.com/austin

01、可插拔

我的项目逐渐成型了之后,有挺多小伙伴吐槽过我的项目太重了,依赖的中间件有点多。

在最开始的那一版需要强依赖MySQL/Redis/Kafka/Apollo(项目启动就需要部署这些中间件),弱依赖prometheus/graylog/flink/xxl-job(想要有完整的项目体验,就需要把这些给部署起来)。

  • MySQL是没有人吐槽的,数据库这种东西,可以说是后端必需的了。

  • Redis暂时还没人吐槽,毕竟用的还是太多了,也没有什么强大的竞品。

  • Apollo经常被吐槽能不能换成Nacos。

  • Kafka时而有人吐槽,想要支持RabbitMQ、RocketMQ。

我以前存在个观念:在公司里中间件是不会轻易替换的,现在我的代码已经实现了一种姿势,感觉没多大必要支持多种中间件实现,你想换就自己动手改改嘛,又不难

「“Apollo太重啦,Apollo不好用!快点支持Nacos!”」「“支持RocketMQ好不好啊”」「“能不能支持RabbitMQ?”」

对我来说并不是啥大理由,我还是觉得Apollo挺好用,足够成熟稳定,同理Kafka亦是如此。不过当我被吐槽多了,总会怀疑自己是不是做得不够好,也会跟身边的大佬讨论讨论,有没有必要支持一些功能。

思来想去,我变了,我又懂了

为了让消息推送平台Austin易上手,我首先把Apollo做成弱依赖,可以通过配置选择读本地文件还是读配置中心(Apollo)。其实当我们使用Apollo时,即便Apollo挂了,Apollo本身就有很强的容灾能力(自带本地文件)

其次,我把Kafka做成弱依赖,可以通过配置选择用Guava的eventbus还是走分布式消息队列(Kafka),后续可能还会支持RocketMQ/RabbitMQ,感兴趣的也可以在我的代码基础上实现一把,蹭个pull request也很香的。

一方面是降低使用门槛而做的,另一方面是可以对具体实现进行可插拔,这是开源项目所需要的。我认为如果是公司级生产环境线上的项目,对这块更多考虑的是异构容灾(而非可插拔)。

于是乎,现在消息推送平台Austin默认的强依赖只剩下了MySQLRedis,其他中间件的都是弱依赖,要做到可插拔我是借助配置去实例化不同的中间件。

当我的配置austin-mq-pipeline=eventbus时,我就不去实例化Kafka相关的生产者和消费者,转而去初始化eventBus的生产者和消费者,那自然接口下的实现类就是为eventbus

02、支持Nacos分布式配置中心

项目已经将Nacos已经接入了!从我做项目开始,就一直有小伙伴留言是不是要支持Nacos作为分布式配置中心,为什么偏偏就选择Apollo。我一直错觉以为我遇到了邪教组织了,现在Nacos都流行到这个地步了?

接入完Nacos,又发现了低版本的客户端会导致SpringBean的懒加载失效,从而导致我的Kafka消费者失败了,折腾了好一阵子!

03、Kafka支持Tag过滤

我的股东们是能直接用我的远程服务的:Kafka的Topic是共享的,Group消费者也是共享的,在不修改的前提下,直接使用会带来一个问题。

当同时有两个或以上的股东在本地启动了Austin,那就会争抢消费这个Topic(相当于一个消费者组里起了多个消费者),导致在测试下发的时候可能收不到自己调试的消息(被别的股东抢去了)。

要解决这个问题我第一时间的想法很简单:不同的股东使用不同的group(相当于每个股东都会有独立的消费者组),那不就完事了嘛?正好我的groupId生成是依赖渠道的code,改掉code就完事咯。

但这还是有问题的:每个股东有独立的消费者组,意味着每个股东能消费整个topic的所有消息,这又意味着股东会接受到其他股东的测试消息(明明只想要自己测试的消息,却来了一条其他人发的)。

要解决这个问题,除了给每个股东一个独立的topic,那就是根据tag过滤啦。

在Kafka实现这种效果,挺简单的:在发送的时候,把tag写进Kafka的头部,在消费前把非自身tag的消息过滤掉就完事了

04、总结

从开始写这个项目到现在还一直在迭代,这个过程受到了不少的吐槽。这种吐槽大多数是正向的,毕竟有人吐槽那才说明我这个项目是真的有人在用的,有人在看的。

最近有个想法:把这个系统做成是线上的,可以由各大开发者在推送消息的时候调用我的接口,做成这样一定会很有意思,面临的挑战和需求也会更多。那我就一直可以迭代,在这过程中一定我还能学到很多以前所不知道的东西。

这次我用@ConditionAlOnProperties这个注解来实现可插拔的配置,但其实如果是提供二方库的形式的话,使用SPI的姿势会更加优雅。

如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin,可以用作毕业设计,可以用作校招,又可以看看生产环境是怎么推送消息的。

仓库地址(求各位兄弟们三连哟!)

ConditionAlOnProperties实现可插拔?的更多相关文章

  1. 我心中的核心组件(可插拔的AOP)~大话开篇及目录

    回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...

  2. 我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器

    回到目录 AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独 ...

  3. 带卡扣的网卡接口使用小Tips,大家注意插拔网线的手法啊!

    最近入手了一台X401,因为机器本身比较薄,它的网卡接口是有卡扣的,插网线的时候卡扣往下沉,这种设计应该有很多机型都采用了.但是大家有没有发现啊,这种接口的卡扣,时间长了,可能会有点松动.为了保护爱机 ...

  4. C#.NET U盘插拔监控

    [1]涉及的知识点 1) windows消息处理函数 ? 1 protected override void WndProc(ref Message m) 捕获Message的系统硬件改变发出的系统消 ...

  5. ARM上的linux如何实现无线网卡的冷插拔和热插拔

    ARM上的linux如何实现无线网卡的冷插拔和热插拔 fulinux 凌云实验室 1. 冷插拔 如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔.我们通 ...

  6. 增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略

    http://blog.csdn.net/silenceburn/article/details/6083375 =========================================== ...

  7. Oracle 12C 新特性 - “可插拔数据库”功能

    Oracle 12C加入了一个非常有新意的功能"可插拔数据库"特性,实现了数据库(PDB)在"容器"(CDB)上的拔功能,既能提高系统资源的利用率,也简化大面积 ...

  8. Oracle12c中多宿主容器数据库(CDBs)和可插拔数据库(PDBs)新特性之运行脚本

    对开发者和DBA们来说,对shell脚本批量任务的影响成了多宿主选项带来的最大改变之一.因为多宿主环境通过服务来连接到可插拔数据库,因此,依靠CRON和OS认证成了换成多宿主环境后的一个最大问题.本文 ...

  9. 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)

    一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...

  10. 如何连接oracle 12c可插拔数据库

    启动根容器:[oracle@eric ~]$ export ORACLE_SID=cup[oracle@eric ~]$ sqlplus / as sysdbaSQL*Plus: Release 12 ...

随机推荐

  1. NOIP2011 提高组 聪明的质监员(二分+前缀和)

    看到这道题,应该都能想到用二分,那问题是怎么去判定呢? 我们考虑用前缀和(a1统计w,a2统计v),枚举每个矿石,,当前判定的值是x,如果该矿石的w>=x,a1[i]=a1[i-1]+1,a2[ ...

  2. Docker | 数据持久化与数据共享

    数据持久化(安装MySQL) 参考另一篇Docker安装mysql: https://www.cnblogs.com/all-smile/p/16778376.html MySQL的数据持久化问题 # ...

  3. JUI(6)线程池

    文章目录 1.SynchronousQueue 2.线程池(重点) 2.1 使用单例 2.2.使用固定大小的线程 2.3.缓存线程池 2.4 七大参数 1.SynchronousQueue packa ...

  4. 学生管理系统(C语言简单实现)

    仅供借鉴.仅供借鉴.仅供借鉴(整理了一下大一C语言每个章节的练习题.没得题目.只有程序了) 文章目录 1 .实训名称 2.实训目的及要求 3. 源码 4.实验小结 1 .实训名称 实训12:文件 2. ...

  5. Workflow,要不要了解一下

    摘要:Workflow本质是开发者基于实际业务场景开发用于部署模型或应用的流水线工具. Workflow(也称工作流,下文中均可使用工作流进行描述)本质是开发者基于实际业务场景开发用于部署模型或应用的 ...

  6. Unreal NetMode&NetRole 解析

    Version: Unreal 4.26 问题 为啥UE编辑器会有EPlayNetMode有三种让你选择. 为啥描述World 的ENetMode 会有4种,而不只是(Client/Server 2种 ...

  7. 畅联新接入物联设备的情况:丰宝 智慧消防领域的 NB水压一体机、智能消防栓、NB液位一体机

    我看了一下,似乎三种完全不同的协议额...应该是电信AEP平台,由双美接入. ------------------------------------------------------------- ...

  8. onps栈使用说明(1)——API接口手册

    1. 底层API 由协议栈底层提供的api,用于涉及底层操作的一些功能实现,这些api接口函数的原型定义分布于不同的文件,它们被统一include进了onps.h中: open_npstack_loa ...

  9. js高级基础部分

    基于尚硅谷的尚硅谷JavaScript高级教程提供笔记撰写,加入一些个人理解 github源码 博客下载 数据类型的分类和判断 主要问题 分类 基本(值)类型 Number ----- 任意数值 -- ...

  10. golang实现一个简单的http代理

    代理是网络中的一项重要的功能,其功能就是代理网络用户去取得网络信息.形象的说:它是网络信息的中转站,对于客户端来说,代理扮演的是服务器的角色,接收请求报文,返回响应报文:对于web服务器来说,代理扮演 ...