架构系列---一套高并发IM通信系统完整设计和实现

56 篇文章 6 订阅
订阅专栏

先行参考:架构秘境系列3---微信、陌陌、WNS著名IM软件设计架构详解

 

1. 服务器端设计

1.1 总体架构

总体架构包括5个层级,具体内容如下图。

 

1.1.1 用户端

移动端重点是移动端,支持IOS/Android系统,包括IM App,嵌入消息功能的瓜子App,未来还可能接入客服系统。

1.1.2 用户端API

针对TCP协议,提供IOS/Android开发SDK。对于H5页面,提供WebSocket接口

1.1.3 接入层

接入层主要任务是保持海量用户连接(接入)、攻击防护、将海量连接整流成少量TCP连接与逻辑层通讯。

1.1.4 逻辑层

逻辑层负责IM系统各项功能的核心逻辑实现。包括单聊(c2c)、上报(c2s)、推送(s2c)、群聊(c2g)、离线消息、登录授权、组织机构树等等内容。

1.1.5 存储层

存储层负责缓存或存储IM系统相关数据,主要包括用户状态及路由(缓存),消息数据(MySQL也可采用NoSql,如MangoDB),文件数据(文件服务器)。

1.2 逻辑结构

 

1.2.1 核心结构

核心结构部分描述IM系统核心组件及其关系。结构图如下。

 

 

客户端从Iplist服务获取接入层IP地址(也可采用域名的方式解析得到接入层IP地址),建立与接入层的连接(可能为短连接),从而实现客户端与IM服务器的数据交互;业务线服务器可以通过服务器端API建立与IM服务器的联系,向客户端推送消息;客户端上报到业务服务器的消息,IM服务器会通过mq投递给业务服务器。

1.2.2 tcp接入核心流程

1.2.2.1 登录授权(auth)

 

 

1、客户端通过统一登录系统实现登录,得到token。

2、客户端用uid和token向msg-gate发起授权验证请求。

3、msg-gate同步调用msg-logic的验证接口

4、msg-logic请求sso系统验证token合法性

5、msg-gate得到登录结果后,设置session状态,并向客户端返回授权结果。

 

1.2.2.2 登出(logout)

 

1、客户端发起logout请求,msg-gate设置对应Peer为未登录状态。

2、 Msg-gate给客户端一个ack响应。

3、 Msg-gate通知msg-logic用户登出。

 

1.2.2.3 踢人(kickout)

用户请求授权时,可能在另一个设备(同类型设备)开着软件处于登录状态。这种情况需要系统将那个设备踢下线。

1-5步,参看Auth流程。

6、 Logic检索Redis,查看是否该用户在其他地方登录。

7、 如果在其他地方登录,发起kickout命令。(如果没有登录,整个流程结束)

8、 Gate向用户发起kickout请求,并在短时间内(确保客户端收到kickout数据)关闭socket连接。

 

1.2.2.4 上报(c2s)

1、 客户端向gate发送数据

2、 Gate回一个ack包,向客户端确认已经收到数据

3、 Gate将数据包传递给logic

4、 Logic根据数据投递目的地,选择对应的mq队列进行投递

5、 业务服务器得到数据

 

1.2.2.5 推送(s2c)

1、 业务线调用push数据接口sendMsg

2、 Logic向redis检索目标用户状态。如果目标用户不在线,丢弃数据(未来可根据业务场景定制化逻辑);如果用户在线,查询到用户连接的接入层gate

3、 Logic向用户所在的gate发送数据

4、 Gate向用户推送数据。(如果用户不在线,通知logic用户不在线)

5、 客户端收到数据后向gate发送ack反馈

6、 Gate将ack信息传递给logic层,用于其他可能的逻辑处理(如日志,确认送达等)

 

 

1.2.2.6 单对单聊天(c2c)

1、 App1向gate1发送信息(信息最终要发给App2)

2、 Gate1将信息投递给logic

3、 Logic收到信息后,将信息进行存储

4、 存储成功后,logic向gate1发送ack

5、 Gate1将ack信息发给App1

6、 Logic检索redis,查找App2状态。如果App2未登录,流程结束

7、 如果App2登录到了gate2,logic将消息发往gate2

8、 Gate2将消息发给App2(如果发现App2不在线,丢弃消息即可,这种概率极低,后续离线消息可保证消息不丢)

9、 App2向gate2发送ack

10、Gate2将ack信息发给logic

11、Logic将消息状态设置为已送达。

注:在第6步和第7步之间,启动计时器(DelayedQueue或哈希环,时间如5秒),计时器时间到后,探测该条消息状态,如果消息未送达,考虑通过APNS、米推、个推进行推送

 

1.2.2.7 群聊(c2g)

采用扩散写(而非扩散读)的方式。

群聊是多人社交的基本诉求,一个群友在群内发了一条消息:

(1)在线的群友能第一时间收到消息

(2)离线的群友能在登陆后收到消息

由于“消息风暴扩散系数”的存在,群消息的复杂度要远高于单对单消息。

群基础表:用来描述一个群的基本信息

im_group_msgs(group_id, group_name,create_user, owner, announcement, create_time)

群成员表:用来描述一个群里有多少成员

im_group_users(group_id, user_id)

用户接收消息表:用来描述一个用户的所有收到群消息(与单对单消息表是同一个表)

im_message_recieve(msg_id,msg_from,msg_to, group_id,msg_seq, msg_content, send_time, msg_type, deliverd, cmd_id)

用户发送消息表:用来描述一个用户发送了哪些消息

im_message_send (msg_id,msg_from,msg_to, group_id,msg_seq, msg_content, send_time, msg_type, cmd_id)

业务场景举例:

(1)一个群中有x,A,B,C,D共5个成员,成员x发了一个消息

(2)成员A与B在线,期望实时收到消息

(3)成员C与D离线,期望未来拉取到离线消息

群聊流程如下图所示

 

 

1、X向gate发送信息(信息最终要发给这个群,A、B在线)

2、Gate将消息发给logic

3、存储消息到im_message_send表,按照msg_from水平分库

4、回ack

5、回ack

6、Logic检索数据库(需要使用缓存),获得群成员列表

7、存储每个用户的消息数据(用户视图),按照msg_to水平分库(并发、批量写入)。

8、查询用户在线状态及位置

9、Logic向gate投递消息

10、Gate向用户投递消息

11、App返回收到消息的ack信息

12、Gate向logic传递ack信息

13、向缓存(Hash)中更新收到ack的时间。然后在通过一个定时任务,每隔一定时间,将数据更新到数据库(注意只需要写入时间段内有变化的数据)。

 

 

1.2.2.8 拉取离线消息

下图中,将gate和logic合并为im-server。拉取离线消息流程如下。 

1、 App端登录成功后(或业务触发拉取离线消息),向IM系统发起拉离线消息请求。传递3个主要参数,uid表明用户;msgid表明当前收到的最大消息id(如果没收到过消息,或拿不到最大消息id则msgid=0)即可;size表示每次拉取条数(这个值也可以由服务器端控制)。

2、 假设msgid==0,什么都不做。(参看第6步骤)

3、 Im-server查询用户前10条离线消息

4、 将离线消息推给用户。假设这10条离线消息最大msgid=110。

5、 App得到数据,判断得到的数据不为空(表明可能没有拉完离线数据,不用<10条做判断拉完条件,因为服务端需要下下次拉离线的请求来确定这次数据已送达),继续发起拉取操作。Msgid=110(取得到的离线消息中最大的msgid)。

6、 Im-server删除该用户msgid<110的离线消息(或者标记为已送达)。

7、 查询msgid>110的钱10条离线数据。

8、 返回给App

……

N-1、查询msgid>140的离线数据,0条(没有离线数据了)。

N  、将数据返回App,App判断拉取到0条数据,结束离线拉取过程。

 

1.2.3 PUSH

ISO采用APNS;Android真后台保活,同时增加米推、个推。

基本思路:push提示信息,App通过拉离线获得真实消息。

另附文档说明此问题。

 

2. 协议设计

 

2.1 TCP数据协议

TCP的数据协议如下图所示。包括header和body两部分。

消息头总共20个字节,具体信息如下表。

 

 

2.2 TCP消息体设计

消息体协议采用ProtocolBuffer(谷歌)协议,版本3.0.0,该协议在序列化效率、压缩、可扩展方面都具有优势。协议条目见附录11.1.1TCP协议命令清单。以下为主要流程涉及的协议

 

2.2.1 认证(auth)

 

 

2.2.2 登出(logout)

 

 

2.2.3 踢人(kickout) 

 

2.2.4 心跳(keepalive,noop)

心跳包消息体为空。

 

2.2.5 单对单聊天(c2c) 

 

 

2.2.6 群聊(c2g)

 

 

2.2.7 拉离线(pull)

2.2.8 控制类(ctrl)

 

 

3. 存储设计

3.1 MySQL数据库

MySQL数据库采用utf8mb4编码格式(emoji字符问题)

3.1.1 主要表结构

3.1.1.1 发送消息表

保存某个用户发送了哪些消息,用于复现用户聊天场景(消息漫游功能需要)。

 

3.1.1.2 推送消息表

保存某个用户收到了哪些消息

 

 

3.1.1.3 群相关表

群基本信息表

 

 

群用户关系表

 

 

3.1.2 水平分库

 

 

3.2 Redis缓存

 

3.2.1 用户状态及路由信息

Redis缓存以uid为key,检索channel(socketid),last_packet_time等。

Gate层,session以channel(socketed)为key,检索uid,及其他信息。

交互接口:gate->logic,通过将channel转换为uid作为key。

logic->gate,将uid转换为channel作为key。

 

3.2.2 其他缓存信息

你觉得该怎么存就怎么存。

 

3.3 文件及图片存储

采用商用云存储。

 

3.4 数据归档

可考虑采用HBase,HDFS作为数据归档,或者相关云存储服务。

 

安全部分略,其他非核心功能略

4. 话外

如果在没有太多经验可借鉴的情况下,要设计一套完整可用的移动端IM架构,难度是相当大的。原因在于,IM系统(尤其是移动端IM系统)是多种技术和领域知识的横向应用综合体:网络编程、通信安全、高并发编程、移动端开发等,如果要包含实时音视频聊天的话,则还要加上难度更大的音视频编解码技术(内行都知道,把音视频编解码及相关技术玩透的,博士学位都可以混出来了),凡此种种,加上移动网络的特殊性、复杂性,设计和开发难度不言而喻。

本文分享了一套完整的海量在线用户的移动端IM架构设计,来自于作者的真实项目实践总结,包含了详细的算法原理图、数据结构定义、表结构定义等等。

即时通讯网注:本文中的架构设计从实际应用的角度看,其实并不完美,多处设计对于高吞吐高并发的IM应用来说也是存在单点性能瓶颈的(比如:提供消息交换逻辑的msg_logic服务、提供全局用户状态查询的单点Redis等),另外IM协议设计可能也稍显混乱(但这是仁者见仁智者见者的事了,不能一概而论)。但文章中的大部分算法原理、协议设计等都是值得借鉴的,总之没必要照搬,但至少能给你自已的方案设计带来灵感,我想这也是本文或即时通讯网的其它类似文章的真正价值所在。

5. 参考资料

《 MQTT》
《 浅谈IM系统的架构设计》
《 简述移动端IM开发的那些坑:架构设计、通信协议和客户端》
《 一套原创分布式即时通讯(IM)系统理论架构方案》
《 从零到卓越:京东客服即时通讯系统的技术架构演进历程》
《 蘑菇街即时通讯/IM服务器开发之架构选择》
《 腾讯QQ1.4亿在线用户的技术挑战和架构演进之路PPT》
《 微信技术总监谈架构:微信之道——大道至简(演讲全文)》
《 如何解读《微信技术总监谈架构:微信之道——大道至简》》
《 快速裂变:见证微信强大后台架构从0到1的演进历程(一)》
《 17年的实践:腾讯海量产品的技术方法论》
>>  更多同类文章 ……

6. 相关阅读

《IM系统的SESSION结构》

《IM系统如何调试TCP协议》

《NAT是怎么回事》

《视频聊天功能如何穿透NAT》

《IM移动端怎么搜索本地聊天记录》

im消息中台
sinat_34814635的博客
04-06 1688
核心模型 客户端:发送消息 服务端:接受消息,并调用底层sdk,并存储消息 第三方sdk:如腾讯sdk 设计模式 模版模式:抽象发送流程,提供各模型构造方法和子流程抽象方法 工厂模式:生产各种模型实例对象(策略工厂) 策略模式:每种模型对各自的接口实现(消息body解析等) 建造者模式:构造消息体和参数等 ...
亿级IM聊天系统架构设计与重难点分析
秃了也弱了
04-02 938
IM系统就是即时通讯(Instant Messaging)系统的简称。IM其实并不局限于聊天、社交这类“典型”应用中,实际上它已经广泛运用于我们身边形形色色的软件中。聊天、直播、在线客服、物联网等所有需要实时互动、高实时性的场景等,都需要应用IM技术。1)微信、qq、钉钉等主流IM应用:这是IM技术的典型应用场景;2)微博、知乎等社区应用:它们利用IM技术实现了用户私信等点对点聊天;3)抖音、快手等直播/短视频应用:它们利用IM技术实现了与主播的实时互动;
一套海量在线用户的移动端IM架构设计实践分享(含详细图文)
热门推荐
$firecat利白的代码足迹$
01-24 1万+
摘要: https://mp.weixin.qq.com/s?__biz=MzI1ODY0NjAwMA==&mid=2247483756&idx=1&sn=a8e3303bc573b1acaf9ef3862ef89bdd&chksm=ea044bf3dd73c2e5dcf2c10202c66d6143ec866205e9230f974fbc0b0be587926699230b6b18#rd
IM架构方案
qq_35040959的博客
02-07 466
这两天思考了一下IM系统架构,大三的时候基于网络文档实现过,时过境迁抽象思考一下
完整IM架构设计
lanxingmo的专栏
10-23 3372
服务的主体功能为提供消息的在线转发和离线消息的获取。从产品侧角度,衍生出多平台的同步转发、互踢及群组的需求。功能上需要提供消息指定路由转发、是否持久化、在线离线机制、心跳包、通知送达、授权验证等。从技术层次上划分,网络层提供长连接/短连接的服务,路由层提供转发,存储层提供持久化。额外的产品需求,还包含第三方的推送和订阅服务。 整体结构如下图: 具体功能: 1、用户接入及消息流程 如下图,用户登陆获取授权,通过jwt token 接入websocket,发送心跳及消息,消息路由到指定的..
基于Tars高并发IM系统设计实现-实战篇4
lanhy999的专栏
07-24 170
要完成以上业务,需要通过不同的微服务模块来进行功能实现
基于PHP的即时通信聊天应用Raingad-IM后端设计源码
最新发布
04-18
系统采用了PHP、JavaScript、CSS和HTML等技术,实现了即时通信聊天应用的功能,支持文本、文件、图片、语音、视频等消息格式,还支持点对点音视频聊天。项目支持web端、桌面端和uniapp,uniapp可以打包成小程序、h5...
Android-IM架构设计
02-26
TimerHelper类的内部封装了系统的Timer及TimerTask来实现,对外提供startTimer以及stopTimer接口。startTimer需要一个布尔类型的参数标志启动定时任务是需要执行一次,还是永久执行。新生成TimerHelper实例的时候...
高并发IM系统架构优化实践
02-25
摘要:介绍如何设计一个稳定、高并发、消息保序的IM系统,以及如何通过使用存储层的高级功能来优化系统架构。在构建社交IM和朋友圈应用时,一个基本的需求是将用户发送的消息和朋友圈更新及时准确的更新给该用户的...
JAVA毕业设计-高性能IM即时通信系统源码+java开发文档.zip
11-27
JAVA毕业设计——高性能IM即时通信系统源码+java开发文档.zipJAVA毕业设计——高性能IM即时通信系统源码+java开发文档.zipJAVA毕业设计——高性能IM即时通信系统源码+java开发文档.zipJAVA毕业设计——高性能IM即时...
《如何支持过千万级高并发消息量——网易IM云服务架构设计与实践》-周梁伟
09-21
《如何支持过千万级高并发消息量——网易IM云服务架构设计与实践》-周梁伟
小米IM通讯服务器架构
11-14
小米IM通讯服务器架构
QQ IM架构学习总结
03-28
NULL 博文链接:https://fastwei.iteye.com/blog/1236676
c# socket编程 cs架构实例三:即时通信
11-03
c# socket编程 cs架构实例三:即时通信。包含服务端和客户端,是一个很好的学习C# socket编程和CS架构的例子。http://www.tangshansoft.cn
一个通用即时通讯(IM系统设计
OpenIM的博客
09-14 1995
本文章参考https://systeminterview.com/design-a-chat-system.php,有删减。 在本章中,我们将探讨聊天系统设计。几乎每个人都使用聊天应用程序。图12-1显示了市场上一些最流行的应用程序。 聊天应用为不同的人执行不同的功能。确定确切的要求是极其重要的。例如,当面试官考虑一对一聊天时,您不希望设计一个专注于集体聊天的系统。探索功能需求是很重要的。 步骤1-确定需求 当然,世界上没有最完美的架构,只有最合适的架构,也没有所谓的通用方案,不同的解决方案都有其优缺.
如何设计一个亿级消息量的 IM 系统
多看多听多总结
05-02 774
IM核心概念 用户:系统的使用者 消息:是指用户之间的沟通内容。通常在IM系统中,消息会有以下几类:文本消息、表情消息、图片消息、视频消息、文件消息等等 会话:通常指两个用户之间因聊天而建立起的关联 群:通常指多个用户之间因聊天而建立起的关联 终端:指用户使用IM系统的机器。通常有Android端、iOS端、Web端等等 未读数:指用户还没读的消息数量 用户状态:指用户当前是在线、离线还是挂起等状态 关系链:是指用户与用户之间的关系,通常有单向的好友关系、双向的好友关系、关注...
im即时通讯开发新手入门:零基础理解大型分布式架构
蔚可云的博客
04-25 405
随着社会的发展、互联网技术的进步,以前的大型机服务端架构很显然由于高成本、难维护等原因渐渐地变得不再那么主流了,替代它的就是当下最火的互联网分布式架构。 从若干年前大行其道的传统大型机到如今的分布式架构,技术发展已经经历了好几个阶段,我们只有弄明白典型互联网架构在各个阶段的演进,才能更好地理解和体会分布式架构的好处,从而有助于我们序设计适合于自已公司、产品或项目的架构(也包括设计即时通讯网专注的IM和消息推送这类系统,因为技术思路的原理都是一脉相承的)。那么本文我们就来聊聊分布式架构的演进过程,希望能给大家
WebRTC
aig8440的博客
06-28 227
WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的技术,是谷歌2010年以6820万美元收购Global IP Solutions公司而获得的一项技术。 WebRTC实现了基于网页的视频会议,标准是WHATWG 协议,目的是通过浏览器提供简单的javascript就可以达到实时通讯(Rea...
OFDM-IM 和 索引调制
06-09
OFDM-IM是一种基于正交频分复用(OFDM)的索引调制技术。与传统的OFDM技术不同,OFDM-IM在OFDM子载波上采用了多维调制,以实现更高的信息传输速率和更好的系统性能。 索引调制是一种将数字信号映射到离散的信号点集合中的调制技术。在索引调制中,每个数字信号对应一个唯一的索引,该索引可以用于在信号点集合中找到与之对应的信号点。索引调制通常用于对数字信号进行有效的压缩和编码,以便在有限的带宽和存储空间下传输和存储大量数据。 OFDM-IM结合了OFDM和索引调制的优点,可以同时实现高速数据传输和有效的数据压缩。在OFDM-IM中,每个OFDM子载波上采用了多维调制技术,将数字信号映射到一个离散的信号点集合中。然后,通过对不同子载波上的信号点进行合并和编码,可以实现对原始数据的高效压缩和编码。OFDM-IM在无线通信、宽带接入、数字电视等领域得到了广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Python进阶---python实现substring截取子字符串 68379
  • 一文理解class.getClassLoader().getResourceAsStream(file)和class.getResourceAsStream(file)区别 67860
  • 四款好用的免费直播编码推流软件 66916
  • mysql---mysql -e详解 58472
  • Python进阶---python strip() split()函数实战 47589

分类专栏

  • 精萃集 付费 59篇
  • 卫星 6篇
  • AI 7篇
  • 中间件 94篇
  • Ad 4篇
  • Rust 2篇
  • 架构之海 1篇
  • 移动端 3篇
  • Java 199篇
  • Java高并发 26篇
  • Java弥散 23篇
  • JavaScript/TypeScript 4篇
  • Spring/SpringBoot/SpringCloud 30篇
  • 笔试/面试/考证 69篇
  • 架构专辑 56篇
  • 区块链 101篇
  • 产品艺术 22篇
  • Python专辑 33篇
  • Unix/Linux/Shell/Vim/Awk/Tcl 81篇
  • Redis专辑 47篇
  • WebSocket/Socket 13篇
  • App(移动端) 10篇
  • XShowAlgorithm 10篇
  • Git/Github/Gitlab/Gist/Gitbook 18篇
  • Golang 32篇
  • 画声 23篇
  • 研发管理 19篇
  • 投资理财 6篇
  • Mybatis 7篇
  • Mac 2篇
  • Maven 3篇
  • 网络通信-多线程 52篇
  • 技术思想-工具使用 39篇
  • C/C++ 65篇
  • 商业-财经-职涯-养生 19篇
  • 安全-防御-逆向解析-漏洞 11篇
  • 数据结构/编程算法 42篇
  • 技术思想/性能优化/代码重构 11篇
  • 大数据-云计算-数据库 74篇
  • 操作系统/编译原理 5篇
  • CDN 7篇
  • TCP-IP-UDP-HTTP-RTCP 17篇
  • 流媒体/直播/短视频/WebRTC 43篇
  • 运维管理 13篇
  • Mysql 18篇
  • NoSql 13篇

最新评论

  • ConnectionString 属性尚未初始化。问题的最直接解决方案!

    Ma_QiuddTou: 这个cs页在哪里

  • Apollo核心原理之眼前一亮

    普通网友: 感谢大佬分享好文,学到了不少新知识,支持大佬,期待大佬持续输出优质文章!【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 7个向量数据库对比:Milvus、Pinecone、Vespa、Weaviate、Vald、GSI 和 Qdrant

    terryep: l连个总结都没有,谁好谁坏?

  • GoLang核心知识点

    CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/618482440。

  • VScode 单步断点调试Nodejs方法总结

    草原上有什么: ljjjjjjjjjjjjjjjjjjjjjjjjjjjjj

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • HTTP3版本和实现验证
  • QUIC分析、调试和可视化 工具
  • QUIC官方完整参考
2024
06月 3篇
05月 2篇
04月 8篇
03月 5篇
02月 23篇
01月 11篇
2023年109篇
2022年148篇
2021年38篇
2020年113篇
2019年225篇
2018年88篇
2017年72篇
2016年55篇
2015年182篇
2014年28篇
2013年87篇
2012年3篇
2011年3篇
2009年12篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司济宁建设网站武汉网站排名优化价格防城港外贸网站设计诸城品牌网站设计哪家好衡水网站关键词优化多少钱吉祥网站搭建哪家好商洛网站推广哪家好延安网站改版价格鹤岗网络推广价格垦利网站优化按天扣费价格石岩外贸网站设计推荐柳州关键词按天收费合肥设计公司网站报价佛山设计网站多少钱安庆seo网站推广通辽网页设计报价重庆SEO按效果付费报价阿里网站优化推荐至尊标王多少钱常德百度爱采购哪家好长葛百度爱采购价格塘坑网站建设价格滨州网站建设公司宣城百度网站优化排名哪家好新余网站搜索优化公司张家界百姓网标王推广哪家好辽阳网站关键词优化哪家好塘坑网页设计推荐黄山网络营销荷坳网站推广方案多少钱歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化