Norman | 技术博客

荟萃,探索,蓄力,拼搏


  • 首页

  • 分类

  • 归档

  • 标签

一次因TCP挥手导致的HTTP请求异常

发表于 2019-06-22   |   分类于 http   |  

线上业务需要http需要和多个上游交互,使用httpclient包装的请求类,通过日志扫描系统的异常(grep),发现到达某个上游的请求,每天都会有几次异常,导致请求失败,同时抛出 NoHTTPResponseException!
通过Apache官方文档,目测是因为服务端过于拥挤导致连接未响应,直接被丢弃了,后经询问,服务器此时的QPS并不高

因为是服务器之前频繁的通信,所以最好使用长连接,http层加入keepalive机制。我们把httpclient的keepalive的时间设置成30秒,不过后面依然会出现,必定是另有原因。

阅读全文 »

EleasticSearch 线上大索引按日期分割

发表于 2019-04-23   |   分类于 ElasticSearch   |  

1. 背景

由于项目初期设计问题,采集到es的业务日志只使用了一个索引(index),随着线上日志量的增长,es很快飙升到磁盘警戒线,线上找了一圈,很多文章版本都比较老旧,最终直接啃官方文档得出,没有copy别人博客,如果你中途不走神,本文总共15min。version 适用于es 6.0+

阅读全文 »

揭开神秘面纱——深入浅出ThreadLocal

发表于 2017-12-08   |   分类于 java , threadlocal , 多线程   |  

能够找到这篇文章,说明你已开始学习Java的多线程了,也了解多线程的同步、锁等概念。但,ThreadLocal虽出现在多线程的环境中,对于它的使用,并不涉及到锁和同步的概念。它生于多线程,伴随着多线程的热点,而并不沾染多线程的常见问题,是不是莫名的小清新呢?如果你对它有所了解,听说过内存泄露,如何才能更好的驾驭它呢?带着好奇和疑惑,一起深入ThreadLocal吧!

阅读全文 »

Netty入门第五章——协议栈开发纪要

发表于 2017-11-01   |   分类于 netty   |  

Netty的HTTP协议栈开发的客户端和服务端具有Netty的天然优势——异步事件驱动。所以以此开发的HTTP协议栈程序也是异步非阻塞的。本章节介绍如何利用Netty提供的基础完成HTTP协议栈的开发。

1. Netty+XML 协议栈开发

HTTP仅仅是承载数据交换的通道,是载体而不是Web容器,没有必要上Tomcat等重量型容器。

2. WebSocket开发

对于HTTP协议,开销较大,服务器只有收到请求才会应答,不适合做低延迟应用。Websocket将网络套接字引入客户端和服务端。浏览器和服务器之间可以通过套接字建立持久的连接。双方都可以互发数据给对方。

阅读全文 »

Netty入门第四章——编解码技术

发表于 2017-11-01   |   分类于 netty   |  

简介

本章主要内容:

  • Java序列化的缺点
  • 业界流行的几种编解码框架介绍

Java的序列化目的:

  1. 网络传输
  2. 对象持久化
阅读全文 »

Netty入门第三章——粘包和拆包

发表于 2017-11-01   |   分类于 netty   |  

TCP粘包产生原因

  1. 应用程序write写入的字节数大小大于套接字发送缓冲区的大小。
  2. 进行MSS大小的TCP分段。
  3. 以太网帧的payload大于MTU进行IP分片。
阅读全文 »

Netty入门第二章——NIO介绍

发表于 2017-11-01   |   分类于 netty   |  

1. 同步阻塞BIO

  1. serversocket负责绑定IP和Port,socket负责发起连接操作。连接成功后,通过输入/输出流进行同步阻塞式通信。
  2. 传统请求-应答模型,Acceptor线程每接受一个请求,创建一个线程处理请求并返回。

2. 伪异步IO

  1. 后来考虑到高性能/高并发场景,演进了用线程池/消息队列实现1个或多个线程处理N个客户端。但底层通信机制仍是同步阻塞IO,故称作“伪异步”。线程池中的线程数量和队列大小可控,因此不会导致资源耗尽和宕机。
  2. 弊端:JDK的API文档中,对于InputStream和OutputStream中的read(byte[] b)和write(byte[] b)操作,都是同步阻塞的,亦即一直阻塞直到发生如下事件:
    1. 有数据可读。
    2. 读到数据末尾。
    3. 发生空指针或IO异常。

如果大量连接上来,前端只有一个Acceptor线程接入请求,那么,之前的请求在线程池中的队列(阻塞队列实现)中排队,队列满,入队操作阻塞,新请求将被拒绝。破解这一难题,NIO入场。

阅读全文 »

Nette入门第一章——IO演进

发表于 2017-11-01   |   分类于 netty   |  

1. IO 基础

1.1. linux网络IO模型

  1. 阻塞IO模型
  2. 非阻塞IO模型
  3. IO多路复用模型(NIO)
  4. 信号驱动IO模型
  5. 异步IO模型
    阅读全文 »

Java 之 volatile 关键字

发表于 2017-04-02   |   分类于 java , multithread   |  

前言

  要想进军多线程,玩玩高并发,那么你肯定知道线程同步,同步是为了协调多个竞争者对资源的同时访问。对应Java,我们第一反应可能会跳出sychronized关键字,这个关键字能够修饰类,方法,静态方法以及代码块。但是它的性能在高并发下是相当低下的,属于重量级锁。有的业务场景可能不需要这么重量级的锁(比如读多写少,我们如果能够保证获取到的值是最新的就OK),随着对JVM的深入了解,发现CPU不是每次都从内存中取值,各个内核都有自己的缓存,若每个内核中的线程同一时刻对共享变量进行操作,谁的结果才是正确的呢?这样就出现了各个线程的数据同步问题。

阅读全文 »

服务器基于ThreadPool接收文件

发表于 2017-02-09   |   分类于 java , ThreadPool   |  

背景

上篇文章(一文带你进入Java之ThreadPool)基本上介绍了Java中的线程池的类型,以及如何按照业务不同自定义线程池。那么问题来了,池建好了,如何让它运行起来呢?本文主要围绕这一主题——让线程池跑起来,进行测试!

阅读全文 »

12
Norman

Norman

一个有思想的程序员

12 日志
9 分类
21 标签
RSS
github weibo
友情链接
  • 江南大学
  • lixiaolin
  • codertian
  • JThink
© 2016 - 2019 Norman
由 Hexo 强力驱动
主题 - NexT.Muse