写一篇博客来记录从 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. taotao单点登录的用户Controller、service(注册、登录、验证是否登录方法)

    接口文档: 1.1. 注册接口 1.1.1. 检查数据是否可用 请求方法 GET URL http://sso.taotao.com/user/check/{param}/{type} 参数说明 格式 ...

  2. POJ3169:Layout(差分约束)

    Layout Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15705   Accepted: 7551 题目链接:http ...

  3. 解析json方式之net.sf.json

    前面转载了json解析的技术:fastjson,今天说下另外一种技术. 下载地址 本次使用版本:http://sourceforge.net/projects/json-lib/files/json- ...

  4. spring 中的@Import注解和@ImportResource注解

    概述:@Import注解是引入带有@Configuration的java类. @ImportResource是引入spring配置文件.xml 案例的核心代码如下: package com.timo. ...

  5. centos7 mysql cluster集群搭建基于docker

    1.准备 mn:集群管理服务器用于管理集群的其他节点.我们可以从管理节点创建和配置集群上的新节点.重新启动.删除或备份节点. db2/db3:这是节点间同步和数据复制的过程发生的层. db4/db5: ...

  6. CSS学习之float解析

    转自:http://www.w3cplus.com/css/float.html 一.float是什么? float即为浮动,在CSS中的作用是使元素脱离正常的文档流并使其移动到其父元素的“最左边”或 ...

  7. Nodejs写的搬家工具知识分享

    这篇文章 主要学习这两个模块的使用: request-promise-native : https://github.com/request/request-promise-native cheeri ...

  8. HDU 1162 Eddy's picture (最小生成树 普里姆 )

    题目链接 Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to be ...

  9. 在ubuntu 上面安装ubuntu touch 模拟器

    Canonical 公司已经发布了一个运行着Unity8和Mir的Ubuntu Touch模拟器.虽然有一些bug,例如在64位的系统上会使系统崩溃,但我们相信这些都会被一 一修复,这篇文章将教大家如 ...

  10. linux基础-临时和永久修改ip地址以及通配符相关

    一.临时配置网络(ip,网关,dns) 修改临时ip地址: 1.ifconfig查看当前的网卡和ip地址 2.临时修改IP地址:ifconfig ens32 192.168.16.200/24,ifc ...