写一篇博客来记录从 Python 转型到 Java 的学习成果。
整体架构:
rpc: dubbo + thrift
idl: thrift
registeration: zookeeper
MQ: kafka
sql: mysql
noSql: redis
过程中遇到的问题:

1. 数据库唯一标示ID
沿用了 sonwflake 的设计方案, 单个服务每毫秒最大吞吐量为 4096 个ID
2. 日志部分
目标: 每次请求只有一条info日志, 并且其他日志格式保持统一。(如 warn error)
日志格式: logID {method request response} {runTime}
runTime: 可在函数内部自定义计算代码段的运行时间
解决思路:
1. 考虑到一条请求只有一条日志,因此需要重写log库
2. info 这种日志每次调用还要手动打印出来太费劲了,所以考虑到了用 dubbo SPI filter 扩展
3. 重写log库
1. 单利: 由于dubbo处理每次请求使用的都是不同的线程来处理,所以保证每条请求保证只有一个info日志并且还能把代码段运行时间保证存储在一条日志中这里考虑了单例,不能每次调用接口时都 new 一个新的log对象 1. 不符合个人编码风格,重复的代码太多了。 2. 接口调用内部方法时要记录方法内部的代码段运行时间不容易。 但单利就能很好的解决这个问题。
2. 保证日志数据为线程级别: 又回到了刚才的问题,dubbo每次请求都是用一个线程来处理当前请求的,所以使用的单利这时候就会出现数据记录错误的问题,这时候考虑到了创建一个容器,用来存储需要打印的数据,用线程号来区分是哪个线程级别的数据。
3. runTime: 这里跟日志问题2一样,都需要保证线程级别参数不能出现问题。
3. 消息队列设计:
场景:
1. 关注用户行为(follow服务)
2. 更新关注feeds(focus服务)
3. 更新消息 + 推送(message)
设计思路:
常用的设计思路就是 product -> MQ -> consumer
比如上面的这个案例 那么我们第一想法就是 谁需要消费则谁是消费端
follow -> MQ -> (focus, message)
这时 follow服务作为kafka的 producer
focus, message服务作为kafka的 consumer
优点: 配合 consumerGroup 效率最高
缺点: 维护成本高, 优化是需要改动多个服务

更新方案: followProducer -> MQ -> kafkaConsumer -> (focus, message)
followProducer: dubbo服务提供者 + kafka生产者
kafkaConsumer: kafka消费者 + dubbo服务消费者
(focus, message): dubbo服务提供者
这样的设计就是所有服务都可以是kafka的生产值, 但只有一个kafka的消费者消费者接收到来自kafka的消息后进行对其他服务的消费
优点: 维护成本低,扩展性强,优化时只需要改动一个项目
缺点: 承载了一部分业务,运行时间慢(优化: 使用多线程处理)
3. 关注feeds设计:
需求: 关注用户行为时,更新用户的关注列表
设计思路: 数据存储在redis中, 使用 sorted set(有序集合)结构存储关注feeds
其实有推拉模式,消息订阅的意思。
关注一个用户行为可以理解成 关注一个用户动态的行为
如果想要在获取时更轻松,那么就要在关注时受点累将要展示的数据整理好
4. dubbo(坑贼多):
由于微服务使用的是 dubbo + thrift 而上层api又是 php 所以在调用时出现了不少毛病,最后扩展了dubbo的原生协议解决了这个问题。
上面这个问题解决了,但是又出现了一个令人发指的问题!!!就是java服务相互调用时只要出现并发必定报错!!!解决这个问题使用到了多协议,nthrift + thrift原生协议。

duboo服务使用thrift协议 + MQ的更多相关文章

  1. thrift协议的服务进压力测试

    Thrift vs  Grpc内容如下链接 http://blog.csdn.net/dazheng/article/details/48830511 背景:Facebook 开发的远程服务调用框架 ...

  2. Internet上的WWW服务与HTTP协议(非常非常不错的文档,推荐订阅)

    Internet上的WWW服务与HTTP协议 兼容性----H1TP/1.1与HTTP/1.0后向兼容;运行1.1版本的web服务器可以与运行1.0版本的浏览器“对话”,运行1.1版本的浏览器也可以与 ...

  3. NET(C#)接入Dubbo服务,Zookeeper作为Dubbo服务的注册中心,实现thrift协议访问接口(3)

    如何引用Zookeeper.dll 下载最新版本的Zookeeper 地址:http://mirrors.cnnic.cn/apache/zookeeper/ 没有.NET代码 dotnet代码下载 ...

  4. (11)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Thrift高效通讯 (完结)

    一. 什么是 RPC Restful 采用 Http 进行通讯,优点是开放.标准.简单.兼容性升级容易: 缺点是性能略低.在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC(Remote P ...

  5. 消息服务百科全书——为什么使用MQ

    为什么要使用MQ?有如下几个好处: 解耦 在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一接口.这允许你独 ...

  6. Web服务及http协议

    HTTP:HyperText Transfer Protocol--超文本传输协议 超链接:能够在文档之间跳转的文本 早起的Web:仅仅是能够实现在文档之间跳转的一种协议 http/0.9:仅支持纯文 ...

  7. 编写服务说明.thrift文件

    1.数据类型 基本类型: bool:布尔值,true 或 false,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 J ...

  8. c# 搭建服务端 传输协议(2)

    在网络的数据传输中,要将需要传输的数据转换为二进制数据后传输,才能被服务端正常的接收,socket传输中,接收到的数据都会被放入byte[]中存放,所以在数据发送前,对二进制的数组进行有规律的排序,才 ...

  9. Android网络服务发现(NSD)协议的使用

    Android的网络服务发现协议(NSD)能够用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会很有帮助. Android的NSD的用法大致上分为四种操作: 1. 注 ...

随机推荐

  1. [BJOI2006]狼抓兔子——最小割转对偶图最短路

    其实这个题直接Dinic跑最小割可过. (小优化是: 无向图建网络流,一条边不用建成4条,可以正反容量都是边权即可.完全等价 ) [无效]网络流之转换对偶图 一个巧妙的事情是,如果建边合适的话,最小割 ...

  2. 编写clearedit的安卓控件

    1.写一个自定义的控件 public class ClearEditText extends AppCompatEditText implements View.OnFocusChangeListen ...

  3. com.mongodb.MongoException$CursorNotFound: cursor not found on server异常处理

    java链接MongoDB处理大量数据时经常碰到cursor not found 的异常,其实是超时所致 Exception in thread "main" com.mongod ...

  4. webpack 小记

    零.入口与输出 //对像语法 entry: { aa: __dirname + '/src/aa.js',    //(chunkName :path) bb: __dirname + '/src/b ...

  5. demo 集合

    github: https://github.com/zhanghaifeng1234565/ProjectFunctionCollect        https://github.com/XY-W ...

  6. DotNETCore 学习笔记 日志

    Logging --------------------------------------------------------------------------------------- Impl ...

  7. 填坑webpack

    1.Concepts: webpack is a module bundler for modern JS applications. Since there are lots of complex ...

  8. mybatis注解动态sql

    @Insert("INSERT INTO user (name, age, gender, experience) VALUES (<a href="http://www.o ...

  9. POJ1458(最长公共子序列)

    Common Subsequence Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44223   Accepted: 18 ...

  10. 转一篇CF题目的博客

    题意: 给你一颗n(n<=10^5)个节点树根为1的树,然后进行dfs,求每个点,在dfs中被访问时间的期望. let starting_time be an array of length n ...