如何提高服务可用性

如何提高服务可用性


[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/system/how-to-improve-service-availability.html

低层次的说,大概有如下方法

  • 容灾(lvs+keepalived等)
  • 负载均衡+心跳
  • 限流
  • 熔断&降级
  • 重试
    • 业务重试
    • 框架切换节点重试等
  • 监控+预警
    • 业务上下游流量监控+接口流量监控
    • JVM等指标监控
    • 指定日志监控
    • 主动发送预警
  • (补充)解耦:动静分离/前后分离
阅读更多

shell-系统优雅停机

[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/system/system-graceful-shutdown.html

脚本

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
echo "请输入进程ID:"
read pid
echo "正在尝试使用kill -15终止进程$pid ..."
kill -15 $pid
sleep 5 # 等待5秒,给进程清理和资源回收的时间
if ps -p $pid > /dev/null; then # 如果进程仍然存在,则使用kill -9进行强制终止
echo "进程$pid 仍在运行,正在尝试使用kill -9强制终止 ..."
kill -9 $pid
fi
echo "进程$pid 已终止"

Java I/O模型与系统I/O模型

[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/system/IO-model2.html

接: IO模型

Java I/O模型与系统I/O模型的映射关系

Java的I/O模型是建立在底层系统I/O模型之上的,它通过对底层系统I/O调用的封装,提供了更高层次的抽象和统一的I/O接口。Java的I/O类库支持的I/O模型和底层系统I/O模型之间的映射关系如下:

  1. 阻塞式I/O模型

    Java的I/O类库默认使用阻塞式I/O模型。在该模型下,I/O操作会一直阻塞,直到数据准备好或者操作完成才返回。对应的系统I/O模型是传统的阻塞式I/O模型。主要对应的系统I/O模型是Linux系统中的read(), write()

    这里主要是各种Stream、Reader、Writer、Socket的读写,其中Socket为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

    // 监听 8080 端口进来的 TCP 链接
    serverSocketChannel.socket().bind(new InetSocketAddress(8080));

    while (true) {

    // 这里会阻塞,直到有一个请求的连接进来
    SocketChannel socketChannel = serverSocketChannel.accept();

    // 开启一个新的线程来处理这个请求,然后在 while 循环中继续监听 8080 端口
    SocketHandler handler = new SocketHandler(socketChannel);
    new Thread(handler).start();
    }
  2. 非阻塞式I/O模型

    Java的I/O类库可以使用非阻塞式I/O模型。在该模型下,I/O操作会立即返回,不会阻塞,但此时数据可能还没有准备好或者操作没有完成。需要使用轮询的方式检查操作是否完成。对应的系统I/O模型是非阻塞式I/O模型。主要对应的系统I/O模型是Linux系统中的select()或poll()函数
    java中主要是通过selector轮询socket的事件:

阅读更多

IO模型

[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/system/IO-model.html

背景

服务器网络模型
这篇IO模型是《每天进步一点点》里的第一篇学习记录,真的是忘了看看了忘了。。其实不用记服务器的,大概理一下JAVA自己的就简单多了,这里稍微总结一下:

JAVA IO模型

JAVA的IO模型分为BIO、NIO、AIO三种,其中BIO是阻塞IO,NIO是非阻塞IO,AIO是异步IO

阅读更多

jstack定位线上问题

jstack定位问题


出现死循环后,我们可以使用jstack命令来定位问题。

1. 查找JVM进程ID(pid=23199

1
`ps -ef | grep java`
阅读更多