之前公司没有使用msmq/rebbitmq等消息队列,一方面是觉得太重,想避免在引入中间件。另外的原因是公司的业务并不需要消息持久化和确保可送达(at-least-once VS at-more-once)。所以在一番调研之后,选择了nats:(https://nats.io/)用它来当消息队列使用。

  nats的优点:

  1.使用简单:github(https://github.com/nats-io/gnatsd)上直接clone下源码 go build 即可。

  2.无需多配置:client端只需知道nats的节点和约定好的subject名称即可

  3.快!由于nats的特性,只发送不确认送达

  4.有多种客户端支持,由于公司有.net和go的代码,所以需要可以跨语言的消息中间件

  5.拥抱开源,我很喜欢

  

  项目上线了半年,发现了如下问题:

  1机房出现故障,导致nats server端需要重连,但是我们运维实践下来发现说进程需要手工重启

  2还是nats timeout后,需要在reconnection里要重新初始化连接,不方便

  3我们使用thrift作为消息编码,感觉编码后的消息臃肿,不如protobuf

  4需求的变更,谁知道会不会改成消息不可以丢失呢。。

  于是决定替换为consul+grpc

  consule:解决的是服务健康监控和服务发现的问题,一样对外只暴露一个IP

  grpc:天生使用http2+protobuf3,编码和传输上不逊于thrift,而且对于熟悉thrift的同学来说pb3点语法so easy

  再也不用担心丢数据的问题了~

为什么我最终替换掉了NATS的更多相关文章

  1. 在notepad++里面使用正则表达式替换掉所有行逗号前面内容

    需求:在notepad++里面使用正则表达式替换掉所有行逗号前面内容,一文本内容如下(只贴一小部分,实际上N多): 级别,層級程序,程式插件,外掛程式鼠标,滑鼠打印,列印打开,開啟博客,部落格联系,聯 ...

  2. 骚操作:不重启 JVM,如何替换掉已经加载的类?

    Java对象行为 java.lang.instrument.Instrumentation 直接操作字节码 BTrace Arthas 三生万物 在遥远的希艾斯星球爪哇国塞沃城中,两名年轻的程序员正在 ...

  3. handlebars.js 用 <br>替换掉 内容的换行符

    handlebars.js 用 <br>替换掉 内容的换行符 JS: Handlebars.registerHelper('breaklines', function(text) { te ...

  4. Javascript中使用replace()方法+正则表达式替换掉所有字符

    Js中的replace方法,只能替换掉第一次匹配到的字符,   而我们经常需要替换一个字符串中所有的匹配字符,这时候可以用正则表达式: str.replace(/a/g,"b"); ...

  5. Spring源码学习:第2步--使用SLF4j+Log4j日志框架替换掉其自身的commons-logging日志框架

    正如Spring官方文档所述,其底层的实现选择了commons-logging作为日志框架.这一"失足"性的选择,竟连Spring自身都抱怨.但是,谁叫Spring如此优秀呢,即使 ...

  6. jersey 用FastJson替换掉默认的Jackson

    @Bean public ResourceConfig resourceConfig() { ResourceConfig resourceConfig = new ResourceConfig(); ...

  7. 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性

    https://mp.weixin.qq.com/s/_hSaI5yMvPTWxvFgl-UItA 小结: 1.根据Java的类加载机制,在同一个ClassLoader中,类是不允许重复的: 2.单例 ...

  8. sqlserver查询的结果复制到excel替换掉回车换行

    从sqlserver查询统计出的结果复制到excel,如果有回车,换行 ,或回车换行 ,复制到excel显示会乱会错版,查询的时候就替换掉回车换行,复制出来就不会乱了 ) ), ),),'') fro ...

  9. re表达式替换掉"\n\t\r”字符

    使用re来将一些字符替换掉,比如替换为空: import re s = "这是一个例子\n,我们的祖国" re.sub("[\n\t\r]", "&q ...

随机推荐

  1. spring mvc3中JACKSON序列化日期格式的问题 - 墙头草的Java - BlogJava

    body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...

  2. shell vim--处理二进制文本

    1 使用vim  -b  :%!xxd 参考:http://www.cnblogs.com/killkill/archive/2010/06/23/1763785.html 2 使用xxd命令 htt ...

  3. StackExchange.Redis 官方文档(一) Basics

    基本使用方法: StackExchange.Redis的核心是 StackExchange.Redis 命名空间的 ConnectionMultiplexer 类;它隐藏了多服务器的实现细节.Conn ...

  4. FastJson的用法

    一.简单数据的序列化 pubic class UserInfo implements Serializable{ private String name; private int age; publi ...

  5. php连接mysql数据库(新浪云SAE)

    新浪云提供了免费的创建服务器端应用的服务.网址为:https://www.sinacloud.com/ 在上面创建好应用,然后在本地使用记事本编写应用的代码如下: <?php echo &quo ...

  6. 《OpenCV3 计算机视觉--Python语言实现 第二版》源代码及纠错

    1.源代码下载地址 <OpenCV3 计算机视觉--Python语言实现 第二版>由我们翻译,英文书名<Learning OpenCV3 Computer Vision with P ...

  7. IOS开发-UI学习-NSMutableAttributedString(带属性的字符串)的使用

    带属性的字符串: NSString *aa = @"hellochinaIloveYou!"; NSMutableAttributedString *mas = [[NSMutab ...

  8. vuejs 子组件传递父组件的第一种方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. leetcode day6

    [13]Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be with ...

  10. PHP获取当前类名、函数名、方法名

    PHP获取当前类名.方法名  __CLASS__ 获取当前类名  __FUNCTION__ 当前函数名(confirm)  __METHOD__ 当前方法名 (bankcard::confirm) _ ...