随笔分类 -  网络编程与分布式

摘要:Lost Update 问题 A4的访问模式r1[x], w2[x], w2[commit], w1[x], w1[commit] 这种访问模式下,w2的更新可能会丢失。因为w1可能基于一个比较old-x来做更新x的操作。 RR 隔离级别下的事务表现 快照读 测试数据: 事务 1: start tr 阅读全文
posted @ 2022-11-17 14:59 牛有肉 阅读(431) 评论(0) 推荐(0) 编辑
摘要:场景:页面包含多个大 sql。 目的:尽量保证接口响应速度,数据库压力可暂不考虑(并发不大,耗时 sql 多)。 思路: 1、如果 redis 中不存在缓存,查询数据库并添加缓存,根据数据变化频率设置缓存过期时间; 2、如果 redis 中存在缓存,提交更新缓存的异步任务(可选,针对数据变化频率高, 阅读全文
posted @ 2021-09-27 23:21 牛有肉 阅读(274) 评论(0) 推荐(0) 编辑
摘要:手写分布式锁,仅适用于单例 Redis。 与多线程的加锁解锁机制一样,分解出加锁解锁需要做的动作后,想办法保证动作的原子性即可。 X86 架构提供了 getAndSet 原语,保证了锁的检查与上锁这组动作的原子性,操作系统在其基础上提供了非常多的加锁方法。 Redis 也提供了类似的 “原语”:SE 阅读全文
posted @ 2021-09-27 11:07 牛有肉 阅读(417) 评论(0) 推荐(0) 编辑
摘要:WebSoket 相较于 HTTP ,有以下优点: 1、包头更短。在建立长连接等需要轮询发送请求确认连接状态的情况下,包头的减小使得服务端压力更小,节省服务端资源。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加 阅读全文
posted @ 2020-12-01 19:54 牛有肉 阅读(354) 评论(0) 推荐(0) 编辑
摘要:直接上源码,查看 register 的实现。我们查看 register 的实现会直接跟进抽象类 SelectableChannel 中: 调用了本身的另一个 register 方法: 该实现为抽象方法,我们直接向下查找 SelectableChannel 子类,查看其实现。因为 SocketChan 阅读全文
posted @ 2020-06-11 21:35 牛有肉 阅读(1156) 评论(0) 推荐(1) 编辑
摘要:众所周知,JVM 创建一个对象分三步: 1.在堆内存开辟内存空间。 2.在堆内存中实例化Car里面的各个参数。 3.把对象指向堆内存空间。 为了提高运行效率,编译器在编译代码时可能会对指令进行重排序。重排序的原则是,保证单线程执行结果的正确性,并遵循 happen-before 原则。 指令间的依赖 阅读全文
posted @ 2020-06-04 23:15 牛有肉 阅读(455) 评论(0) 推荐(0) 编辑
摘要:在 NIO 中,我们读取 channel 中的数据,会通过 channel 的 read 尽最大努力将 Buffer 填满,填满后做一些其它处理。 对于 TCP 协议来说,这种做法无可厚非,因为 TCP 协议本身就不提供定界策略,只负责提供可靠的连接,也就是数据可靠的收发( 以 ack 应答机制为核 阅读全文
posted @ 2020-05-29 17:30 牛有肉 阅读(430) 评论(0) 推荐(0) 编辑
摘要:水平触发(level-triggered,也被称为条件触发)LT:只要满足条件,就触发一个事件。边缘触发(edge-triggered)ET:当状态变化时触发事件。JAVA 的 NIO 属于水平触发,而 epoll 既支持水平触发也支持边缘触发。epoll 性能高于 poll 很重要的一点便是 ep 阅读全文
posted @ 2020-05-27 22:22 牛有肉 阅读(4855) 评论(2) 推荐(1) 编辑
摘要:如果我们要将一个文件通过 socket 发送出去,我们一般会这样写: Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 33456),10 * 1000); DataOutputStream 阅读全文
posted @ 2020-04-20 14:02 牛有肉 阅读(469) 评论(0) 推荐(0) 编辑
摘要:想要理解多路复用技术,首先要了解这个技术出现之前,我们面临的痛点是什么。 以 JAVA 为例,我们想要写一个 TCP 服务端,接收客户端发来的数据,那么我们会这样写: while (true) { Socket socket = serverSocket.accept(); //读取输入缓冲区数据 阅读全文
posted @ 2020-04-14 23:57 牛有肉 阅读(570) 评论(0) 推荐(1) 编辑
摘要:请求报文 HTTP 请求整体的报文结构由 请求行-请求头-请求数据 三部分构成,其中请求行格式是固定的,标识了请求方法/请求URL和协议版本它们之间用空格间隔。 请求头是我们为请求添加的附加信息,也就是一些额外的控制位。我们可以选择性的为请求添加请求头,除了一种特殊情况,POST 请求时请求头中必须 阅读全文
posted @ 2020-03-27 15:59 牛有肉 阅读(2910) 评论(0) 推荐(0) 编辑
摘要:HTTP位于五层模型中的应用层,是传输层(代表为TCP协议)的上层协议。 之前我们通过 socket 实现了使用 TCP 协议进行数据收发:手写一个模块化的 TCP 服务端客户端 ,对 TCP 协议的使用有了一个初步的认识。 简单的说,IP 协议 帮助我们的数据包在复杂的网络环境下进行寻址,但并不能 阅读全文
posted @ 2020-03-26 23:51 牛有肉 阅读(428) 评论(0) 推荐(0) 编辑
摘要:在使用微服务的过程中,RPC 是永远绕不开的点。之前并没有磕的很深,一直觉着 RPC 是一个黑魔法。比如我们常用的 Dubbo、SpringCloud 等框架,将微服务模块间的方法调用封装的像本地方法调用一样,方便又令人费解。 今天如愿以偿的仿照 Dubbo 自己手写了一个 rpc “框架”,虽然简 阅读全文
posted @ 2020-03-24 11:27 牛有肉 阅读(552) 评论(0) 推荐(0) 编辑
摘要:前面的博客 基于 socket 手写一个 TCP 服务端及客户端 写过一个简单的 TCP 服务端客户端,没有对代码结构进行任何设计,仅仅是实现了相关功能,用于加深对 socket 编程的认识。 这次我们对整个代码结构进行一下优化,使其模块化,易扩展,成为一个简单意义上的“框架”。 对于 Socket 阅读全文
posted @ 2020-03-22 18:44 牛有肉 阅读(706) 评论(0) 推荐(0) 编辑
摘要:通过 socket 实现一个 TCP 服务端与客户端,实现通过 TCP 协议进行消息收发。 关键在 socket 的使用的理解上。 socket 是对操作系统提供的协议栈的封装,底层调用的是操作系统提供的协议栈。 当我们调用 ServerSocket 的 accept 方法时,线程阻塞。以 TCP 阅读全文
posted @ 2020-03-21 21:02 牛有肉 阅读(1272) 评论(0) 推荐(0) 编辑
摘要:进行 Socket 编程时经常会碰到 TCP 的粘包与半包问题,很多时候我们选用 netty 等框架而不直接采用原生的 Socket 编程也是因为 netty 帮我们将该类传输过程中可能出现的问题屏蔽掉了,使我们可以抽出更多精力来关注功能的实现,而不是挣扎在处理这些底层问题上。但尽管如此,我们也必须 阅读全文
posted @ 2020-03-21 12:25 牛有肉 阅读(717) 评论(0) 推荐(0) 编辑