基于TimeLine模型的消息同步机制

正常的IM系统流程 在这个方式下,消息同步的基本思路和步骤如下(序号不对应图中序号) 1、把消息存储到离线收件箱 2、向在线用户推送消息 3、在线用户返回收到消息的ack信息 4、服务端清除用户此条离线消息 对于离线用户,登录后直接拉取离线消息即可 这个消息同步方式有它合理的地方 1、流程比较直观 2、网络交互量较少(相对于后边的TimeLine模型而言) 但是这个方案存在更多不足的地ti方 1、我们有App和Web两个端,需要为每个端都写一份离线消息。由于离线消息是扩散写的,多写一份,服务端就多一份压力 2、消息ack回来之后,服务端需要把对应的消息从存储中删除,这个过程性能也是一个问题 这个消息模式在比较单一的IM应用场景下还是能够胜任的。但是随着消息场景越来越复杂,尤其是SDK推出以后,这个模式就存在很多弊端。SDK的应用可能存在很多个端,服务端不可能为每个端都写离线消息! 对于SDK,我们采用TimeLine模型来实现客户端和服务端的消息同步。 以下内容是钉钉的做法,比较了传统架构和现代架构。而我们现在的IM消息同步这块介于两者之间。

线程传递增强之TransmittableThreadLocal

先来看TTL里面的几个重要属性及方法 TTL定义: public class TransmittableThreadLocal extends InheritableThreadLocal 可以看到,TTL继承了ITL,意味着TTL首先具备ITL的功能。 再来看看一个重要属性holder: /** * 这是一个ITL类型的对象,持有一个全局的WeakMap(weakMap的key是弱引用,同TL一样,也是为了解决内存泄漏的问题),里面存放了TTL对象 * 并且重写了initialValue和childValue方法,尤其是childValue,可以看到在即将异步时父线程的属性是直接作为初始化值赋值给子线程的本地变量对象(TTL)的 */ private static InheritableThreadLocal<Map<TransmittableThreadLocal<?

浅析java-nio及netty的reactor模型

1 服务端处理网络请求 首先看看服务端处理网络请求的典型过程: 由上图可以看到,主要处理步骤包括: 获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3)。 构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4)。 返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)。 设计服务端并发模型时,主要有如下两个关键点: 服务器如何管理连接,获取输入数据。 服务器如何处理请求。 2 Reactor 模式 2.

Transaction源码解析之事务配置解析

1 事务配置 关于Spring的事务,大家每天都会遇见或者用到,为了更好的理解Transaction的原理机制,我们从源码角度来解析,本文的调试源码基于Spring-3.2.x版本进行调试。 1.1 配置 配置XML文件annotationTransactionNamespaceHandlerTests.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.

生产-消费模型之虚假唤醒

1 何为虚假唤醒 当线程从等待状态中被唤醒时,只是发现未满足其正在等待的条件时,就会发生虚假唤醒。 之所以称其为虚假的,是因为该线程似乎无缘无故被唤醒。 虚假唤醒不会无缘无故发生,通常是因为在发起唤醒号和等待线程最终运行之间的临界时间内,线程不再满足竞态条件。 2 java中的例子 public class SpuriousWakeupRWLock { private static final CustomQueue CUSTOM_LIST = new CustomQueue(); public static void main(String[] args) throws Exception { for (int i = 0; i < 8; i++) { Thread consumer = new Thread(() -> { try { CUSTOM_LIST.

Spring实例化bean之源码分析

1 实例化bean的主流程 这张图是整体的bean的实例化的流程,我之前关于Spring的生命周期的加载bean和实例化bean的整体过程已有博文,可以 查看文章:Spring之Bean加载-解析-生命周期 调试入口 本文中的Spring源码基于3.2.x版本,为最精简的Spring源码,选取Spring自带的测试用例进行debug调试, 本文只关注单例对象的实例化bean中各组件的源码分析, 入口如下: @Test public void testConfigLocationPattern() { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(CONTEXT_WILDCARD); assertTrue(ctx.