duboo服务使用thrift协议 + MQ
写一篇博客来记录从 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的更多相关文章
- thrift协议的服务进压力测试
Thrift vs Grpc内容如下链接 http://blog.csdn.net/dazheng/article/details/48830511 背景:Facebook 开发的远程服务调用框架 ...
- Internet上的WWW服务与HTTP协议(非常非常不错的文档,推荐订阅)
Internet上的WWW服务与HTTP协议 兼容性----H1TP/1.1与HTTP/1.0后向兼容;运行1.1版本的web服务器可以与运行1.0版本的浏览器“对话”,运行1.1版本的浏览器也可以与 ...
- NET(C#)接入Dubbo服务,Zookeeper作为Dubbo服务的注册中心,实现thrift协议访问接口(3)
如何引用Zookeeper.dll 下载最新版本的Zookeeper 地址:http://mirrors.cnnic.cn/apache/zookeeper/ 没有.NET代码 dotnet代码下载 ...
- (11)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Thrift高效通讯 (完结)
一. 什么是 RPC Restful 采用 Http 进行通讯,优点是开放.标准.简单.兼容性升级容易: 缺点是性能略低.在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC(Remote P ...
- 消息服务百科全书——为什么使用MQ
为什么要使用MQ?有如下几个好处: 解耦 在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一接口.这允许你独 ...
- Web服务及http协议
HTTP:HyperText Transfer Protocol--超文本传输协议 超链接:能够在文档之间跳转的文本 早起的Web:仅仅是能够实现在文档之间跳转的一种协议 http/0.9:仅支持纯文 ...
- 编写服务说明.thrift文件
1.数据类型 基本类型: bool:布尔值,true 或 false,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 J ...
- c# 搭建服务端 传输协议(2)
在网络的数据传输中,要将需要传输的数据转换为二进制数据后传输,才能被服务端正常的接收,socket传输中,接收到的数据都会被放入byte[]中存放,所以在数据发送前,对二进制的数组进行有规律的排序,才 ...
- Android网络服务发现(NSD)协议的使用
Android的网络服务发现协议(NSD)能够用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会很有帮助. Android的NSD的用法大致上分为四种操作: 1. 注 ...
随机推荐
- Mybatis LIKE模糊查询
1.在代码中拼接好字符串后传入进来 2.使用CONCAT在xml中拼接字符串: <if test="queryParam.keyword != null"> AND b ...
- Spring源码解析-配置文件的加载
spring是一个很有名的java开源框架,作为一名javaer还是有必要了解spring的设计原理和机制,beans.core.context作为spring的三个核心组件.而三个组件中最重要的就是 ...
- [洛谷P2016] 战略游戏 (树形dp)
战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得 ...
- 使用mysqldump命令备份恢复MySQL数据库
1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump file] 上述命令将指定数据库备份到某dump文 ...
- C# Producer Consumer (生产者消费者模式)demo
第一套代码将producer Consumer的逻辑写到from类里了,方便在demo的显示界面动态显示模拟生产和消费的过程. 第二套代码将producer Consumer的逻辑单独写到一个 ...
- Dom4j解析语音数据XML文档(注意ArrayList多次添加对象,会导致覆盖之前的对象)
今天做的一个用dom4j解析声音文本的xml文档时,我用ArrayList来存储每一个Item的信息,要注意ArrayList多次添加对象,会导致覆盖之前的对象:解决方案是在最后将对象添加入Array ...
- 【HDU3853】LOOPS [期望DP]
LOOPS Time Limit: 5 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Akemi Homura is a ...
- bzoj1578 [Usaco2009 Feb]Stock Market 股票市场
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1578 [题解] 由于连续买相当于每天买,第二天卖,然后再买.所以每天最后钱尽量多一定是最优的 ...
- PL/SQL 09 包 package
--定义包头 create or replace package 包名as 变量.常量声明; 函数声明; 过程声明;end; --定义包体 create or replace package b ...
- 5.flume实战(二)
需求:监控一个文件实时采集新增的数据并输出到控制台 简单理解就是:监控一个文件,只要这个文件有新的内容追加,就将它输出到控制台. agent技术选型:exec source + memory chan ...