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原生协议。

原文地址:https://www.cnblogs.com/laolibk/p/10219151.html

时间: 2024-08-30 03:10:13

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

rpc服务框架thrift介绍

rpc服务框架目前主要有 thrift, grpc, dubbo, HSF等 这里主要介绍thrift框架 git地址  :https://github.com/apache/thrift/tree/0.9.1 1. 接口定义 tutorial.thrift include "shared.thrift" /** * Thrift files can namespace, package, or prefix their output in various * target langu

Linux之Web服务(1)HTTP协议

Linux之Web服务(1)HTTP协议 前言 在说到Web服务配置之前,先要了解一下Httpd服务所在的Tcp/Ip分层中的http协议. http协议为应用层协议,主要是负责处理超文本传输.http是一个客户端和服务端请求和应答的标准(TCP).客户端是终端客户,服务器端是网站.用户通过Web浏览器.网络爬虫或者其它的工具,客户端发起一个服务器上指定端口(默认为80)的HTTP请求.通过HTTP或者HTTPS协议请求资源由统一资源提示符(Uniform Resourcce Identifie

WEB集群笔记(1)-Web服务和HTTP协议

01.Web服务和HTTP协议 01.01.Web服务的基础:DNS Web服务离不开基础网络和DNS服务. 用户访问网站基本流程,即DNS解析流程 1).浏览器输入网址www.baidu.com,查找本地DNS缓存及hosts文件信息,如果有直接获取IP地址: 2).若没有,发送解析请求给DNS服务器地址,如果LDNS服务器缓存有对应地址,则获取IP地址; 3).若没有,LDNS继续请求DNS根(.)服务器,一层层查找直到找到baidu.com域名对应的授权DNS服务器,该服务器返回IP解析记

Thrift协议

Thrift自下到上可以分为4层 Server(single-threaded, event-driven etc) 服务器进程调度 Processor(compiler generated) RPC接口处理函数分发,IDL定义接口的实现将挂接到这里面 Protocol (JSON, compact etc) 协议 Transport(raw TCP, HTTP etc) 网络传输 Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从

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

为什么要使用MQ?有如下几个好处: 解耦 在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一接口.这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 冗余 有些情况下,处理数据的过程会失败.除非数据被持久化,否则将造成丢失.消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除

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

Android的网络服务发现协议(NSD)可以用于在小范围的网络中发现邻近设备上的某个应用.这对于一些社交网络.多人游戏类的应用会非常有帮助. Android的NSD的使用方法大致上分为四种操作: 1. 注册网络服务 2. 发现网络服务 3. 连接网络服务 4. 注销网络服务 使用NSD时一定要注意: 记得在Manifest中加入android.permission.INTERNET 权限,不然程序会崩溃. 一. 注册网络服务 注册网络服务需要两样东西: 网络服务的信息(NsdServiceIn

web服务以及http协议

在使用计算机的过程中,最容易让人想起的就是浏览网页的经历,只需要用户输入网址,搜索及可以获得想要的资源,那么这个过程计算机是如何完成的? web服务是C/S架构:用户使用的浏览器成为客户端代理,用户访问的资源其实是存储在服务器端.client通过网址(经过dns解析)能够定位自己想要访问的资源位于互联网的哪台服务器,server如何知道客户端请求的是什么内容,那就是http协议 URI:统一资源标识符,用于在全球范围唯一的标识某资源     URL:统一资源定位符,是URI的一个子集,用户唯一标

编写服务说明.thrift文件

1.数据类型 基本类型: bool:布尔值,true 或 false,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 Java 的 short i32:32 位有符号整数,对应 Java 的 int i64:64 位有符号整数,对应 Java 的 long double:64 位浮点数,对应 Java 的 double string:utf-8编码的字符串,对应 Java 的 String 注意,thrift不支持无

API开发第四篇:定义客户端/服务端接口协议

在进行API开发的时候,需要事先定义好app与server交互的数据格式,这样前端人员与服务端人员才能够事先决定好如何获取数据.如何解析数据.如何传输协议. 在我看来目前接口协议无外乎这三种情况: 1. json数据进行交互 2. xml数据进行交互 3. 自定义数据格式交互 自定义数据格式进行前后端的数据交互,需要花费较大的精力,而且需要很有经验的人设计的协议才会确保各个平台的兼容以及良好的可阅读性.并且解析.封装都需要自己来用代码实现,很多第三方库都没办法用上.因为这里我不进行讨论.主要说说