Code Monkey home page Code Monkey logo

fishchatserver2's Introduction

FishChatServer2

Build Status Go Report Card

目录

1说明

吸取了第一版的经验以及我们商业版的探索. 第二版我更多的思考在不要过多的实现轮子, 这个版本将很多业务无关的代码去掉, 并且尽量靠拢微服务. 部署方式可以支持:

  • 普通部署
  • 容器部署 (Kubernetes + Docker)

2特性

⬆ 回到顶部

3架构

3.1聊天设计方案

这里简单陈述一下消息的设计思路, 如下

其中:

1 消息是通过版本号维护的, 是一个递增的int64整数, 由idgen提供服务, 每个用户都有一个独立的自增id

2 新消息到达, 服务端只负责发送给客户端一个轻量级的notify通知

3 客户端收到notify后, 发起同步请求

3.2存储方案

其中最关键的是HBase存储, 所有的消息通过Kafka消费后将插入HBase中, 消息存储的时候会带上递增的版本号. 这样客户端带上一个版本号来请求消息的时候, 将只返回大于此版本号的消息列表.

⬆ 回到顶部

4协议

protocol目录下

  • external 是对外的协议,采用protobuf实现
  • rpc 是服务内部的调用,采用grpc

⬆ 回到顶部

5数据模型

doc/db目录下

⬆ 回到顶部

6服务说明

进入server目录下

access
gateway
logic
manager
notify
register

⬆ 回到顶部

7依赖

7.1系统环境

golang >= 1.4
jdk >= 1.8 (数据处理很多服务用java编写)
go get -u -d github.com/golang/glog
go get -u -d github.com/coreos/etcd
go get -u -d github.com/Shopify/sarama
go get -u -d github.com/wvanbergen/kafka/consumergroup
go get -u -d github.com/tsuna/gohbase
go get -u -d github.com/garyburd/redigo/redis
go get -u -d github.com/BurntSushi/toml
go get -u -d gopkg.in/olivere/elastic.v5
go get -u -d gopkg.in/mgo.v2
go get -u -d github.com/go-sql-driver/mysql
go get -u -d github.com/satori/go.uuid

7.2第三方依赖

etcd 3.0以上版本
redis 
Mysql
kafka
HBase
ElasticSearch(可选)

⬆ 回到顶部

8部署

8.1普通部署

为了方便, 我们在单机上进行部署 (实际部署的时候, 每个服务角色都可以自由水平扩展)

8.1.1依赖安装

安装完成之后创建两个topic:

p2p topic:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic logic_producer_p2p

group topic:
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic logic_producer_group
  • HBase安装 :

安装完成之后创建:

create 'im', 'user', 'msg'
  • redis安装 : 采用默认安装即可

  • mysql安装 : 采用默认安装即可

  • etcd安装 : 需要3.0以上版本, 采用默认安装即可

8.1.2server安装

进入server下面的各个目录 运行 go build, 然后启动服务即可(因为服务做了服务发现, 所以对启动顺序没有要求), 这里为了简单, 每个服务我们只启动一个, 当然启动任意个都是支持的.

  • gateway安装
➜  FishChatServer2 git:(master) ✗ cd server/gateway 
➜  gateway git:(master) ✗ go build
➜  gateway git:(master) ✗ ./gateway 
  • access安装
➜  FishChatServer2 git:(master) ✗ cd server/access 
➜  access git:(master) ✗ go build
➜  access git:(master) ✗ ./access 
  • logic安装
➜  FishChatServer2 git:(master) ✗ cd server/logic 
➜  logic git:(master) ✗ go build
➜  logic git:(master) ✗ ./logic 
  • register安装
➜  FishChatServer2 git:(master) ✗ cd server/register 
➜  register git:(master) ✗ go build
➜  register git:(master) ✗ ./register 
  • notify安装
➜  FishChatServer2 git:(master) ✗ cd server/notify
➜  notify git:(master) ✗ go build
➜  notify git:(master) ✗ ./notify
  • manager安装
➜  FishChatServer2 git:(master) ✗ cd server/manager 
➜  manager git:(master) ✗ go build
➜  manager git:(master) ✗ ./manager 

8.1.3job安装

  • msg-job安装(Java)
➜  FishChatServer2 git:(master) ✗ cd jobs/msg-job
➜  msg-job git:(master) ✗ mvn clean package  -Dmaven.test.skip=true
➜  msg-job git:(master) ✗ java -jar  msg-job-core/target/msg-job-core-1.0-SNAPSHOT.jar

8.1.4中间件服务安装

  • idgen安装
➜  FishChatServer2 git:(master) ✗ cd service/idgen 
➜  idgen git:(master) ✗ go build
➜  idgen git:(master) ✗ ./idgen 

8.2容器部署

部署完全采用Kubernetes + Docker

所以第一步需要搭建KubernetesDocker, 幸运的是现在网络上已经有大量的资料了, 这块我就不多写了.

⬆ 回到顶部

9测试

9.1点对点聊天测试

进入client/p2p目录, 用户可以启动两个以上的进程, 两两之间互相聊天

➜  FishChatServer2 git:(master) ✗ cd client/p2p 
➜  p2p git:(master) ✗ go build
➜  p2p git:(master) ✗ ./p2p 
输入我的id :321
输入对方的id :收到点对点消息: 返回码[0], 对方ID[321], 消息内容[hello]

9.2群聊测试

⬆ 回到顶部

10监控

⬆ 回到顶部

fishchatserver2's People

Contributors

oikomi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fishchatserver2's Issues

编译问题

新人,磕磕碰碰搞定了所有环境,但是卡在最后一步
编译managar 时候报错
../../common/dao/xhbase/xhbase.go:19:2: not enough arguments to return
have (hrpc.Scanner)
want (*hrpc.Result, error)

这个是不是hbase版本过久,函数都已经变动了啊?怎么解决呢?
另:有交流群吗?

一些问题

几个问题请教。
1.access 中的session map 并没有加锁,并发是否安全。https://github.com/oikomi/FishChatServer2/blob/master/server/access/rpc/rpc_server.go#L53
这个global.GSessions,并发会有问题吧?
2.register中对用户是否在线状态的维护,使用redis的setex,然后用ping去刷新时间,是否合理。
3.register中对用户在哪个access的服务器记录,使用redis的string结构,如果用hash记录会大大减少redis中key的数量,提升性能。
4.每次发送一个p2p消息,access接受客户端数据,grpc转发给logic,logic通过regist去redis找到用户是否在线,logic然后根据目标是否在线(而且这个目标是否在线并不准确)决定要不要同步通知access 发送notify给客户端,这个过程都是同步的调用,如果因为给目标用户发送notify消息阻塞,消息发送者就会卡顿。

以上是一些个人看法,还请作者指正

性能怎么样?

想问个生产环境的问题,如果我们需要支持1000W用户同时在线的话,大概需要部署多少服务器?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.