又是一年了

本来想写成日记,但网站的日记模块出了bug。:)

之前,总会回忆过去,想起过去的得失。有很多不甘和懊悔,但最近一个月,反而没有那么焦虑了。

2024就是34岁。如今,听着远方的炮声,心中平静又有一点忐忑。未来会怎么样并不知道,将目光聚焦在已经得到的,而不是未曾拥有的,因为未拥有的东西无穷无尽。这样说不定会有更好的运势呢。

[查看更多...]

来自 大脸猪 发送于 2024-02-09 23:56 - 0 条评论

省流内容提要:

  1. 长连接出现大量的 TIME_WAIT 状态,这通常是由于 HTTP 中的 transport 配置 MaxIdleConnsPerHost/MaxIdleConns 设置不当所导致的。次要原因是,go必须将连接中的数据使用io.ReadAll读完才能Close,否则连接也不会复用。
  2. http client中需要传入transport,其中有配置MaxIdleConnsPerHost/MaxIdleConns,这些配置非常重要,在大吞吐的客户端上可以理解为客户端维持的最终连接数。MaxIdleConnsPerHost默认=2,可能太保守。
  3. MaxConnsPerHost一般配置为等于或略大于MaxIdleConnsPerHost,这个值如果配置的过小,在连接达到阈值,会阻塞连接的创建进行等待。从而影响网络的吞吐。如果 MaxConnsPerHost 配置得过大,而 MaxIdleConnsPerHost 配置得过小,则会引发大量的连接创建和销毁造成TIME_WAIT
[查看更多...]

来自 大脸猪 发送于 2024-01-18 13:12 - 0 条评论

写一个最简单的插件

在实践中学习,动动手指

ch.go

package main

import "common/greeterinterface"

type ChineseGreeter struct {
}

func (g *ChineseGreeter) Greet() string {
    return "世界你好"
}

// 这个就是可导出的函数,插件在lookup这个函数
func NewGreeter() greeterinterface.Greeter {
    return new(ChineseGreeter)
}

编译插件

go build -buildmode=plugin -o ./ch.so ch.go

[查看更多...]

来自 大脸猪 发送于 2023-08-10 22:00 - 0 条评论

有时候在打印日志的时候,在频繁的操作中,会被日志刷屏,但又想定期打印查看状态。这个时候可以利用time.Timer实现一个可指定最小执行间隔的函数,具体看代码吧。

// Package tools ...
package tools

import (
    "sync/atomic"
    "time"
)

/*
    NewTickDo 是一个很有意思的小工具,每隔n秒**尝试**执行一个操作,用在打日志非常方便,避免刷屏

使用方法:

    tick = NewTickDo(time.Second)
    for{
        tick.Do(func() {
            log.Infof("每秒执行一次,未到时间什么都不会发生,直接忽略")

[查看更多...]

来自 大脸猪 发送于 2024-01-09 14:49 - 0 条评论

假设有表

CREATE TABLE IF NOT EXISTS `mytable`(
   `id` INT UNSIGNED AUTO_INCREMENT,
   `flow` INT NOT NULL,
   `name` VARCHAR(100) NOT NULL,
   `age` int NOT NULL,
   key(flow),
   PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入三行原数据
insert into mytable values(1,1,"hello1", 10); 
insert into mytable values(5,5,"hello2", 15); 

[查看更多...]

来自 大脸猪 发送于 2023-06-05 20:37 - 0 条评论

tag: grpc stream client server

本文将使用go,编写通用的服务端、客户端的代码。包含单向流和双向流。

基本原理

  1. 从stream来看,分为接收端(调用Recv)发送端(调用Send)。流程是类似的。
  2. 接收端必须由发送端来控制结束,当客户端调用CloseSend,则服务端Recv EOF。当服务端return nil,则客户端Recv EOF。这样才能保证数据的传输安全。其它情况下终止客户端或服务端,都可能造成数据丢失。
  3. Recv/Send会阻塞,需要在独立协程中处理。
  4. GracefulStop的时候,新的流不能进来,但服务端没有能力终止stream,客户端也不会收到通知。可以return nil强行终止stream,此时客户端收到EOF,客户端如果在发送数据,则数据可能丢失。stream应该有生命周期,在GracefulStop后,等待这个周期再进行强行Stop。一种不好的实现是,发送端是无穷循环永远不CloseSend,使得stream的生命周期无限长,GracefulStop机制失效。
[查看更多...]

来自 大脸猪 发送于 2022-06-06 14:50 - 0 条评论

这篇文章将搜集一些平时在工作中用到的使用反射小实例。

反射反射真快乐。

遍历slice

本实例将遍历slice,并且将它转换为int类型

func Slice2Ints(s interface{}) ([]int, error) {
    val := reflect.ValueOf(s)
    if val.Kind() != reflect.Slice {
        return nil, fmt.Errorf("s:%v is not slice type", s)
    }

    ret := make([]int, 0, 10)
    for i := 0; i < val.Len(); i++ {

[查看更多...]

来自 大脸猪 发送于 2021-09-09 11:29 - 0 条评论

在业务中,kafka的消费者服务非常常见。主要流程是从kafka中取出消息,处理消息。

本文使用kafka-go(github.com/segmentio/kafka-go),调研kafka优雅退出的方式和注意事项。

在这之前,先准备一个多 partitions的 kafka作为实验环境。

kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic testkafka # 创建kafka topic
kafka-topics.sh --delete --bootstrap-server localhost:9092  --topic testkafka # 删除topic

[查看更多...]

来自 大脸猪 发送于 2023-11-07 14:33 - 0 条评论

一般使用容器部署的话会将data目录挂出。

在命令行添加nginx limit zone

首先,进入/data/nginx,ls后会发现有这些目录。

custom  dead_host  default_host  default_www  dummycert.pem  dummykey.pem  proxy_host  redirection_host  stream  temp

进入 default_host,创建文件:

touch http_top.conf
vim http_top.conf
// 文件就这一行内容
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=3r/s;

[查看更多...]

来自 大脸猪 发送于 2023-11-11 20:22 - 0 条评论

使用fpm的方式部署

申请域名并配置好A记录

先申请一个域名,并且将A记录解析到需要部属的机器IP。 这里以pan.yinzihao.com为例

使用docker-compose部署服务

首先在目录下创建这些文件,创建nextcloud文件夹

run.sh

nohup bash /home/loop.sh &
/entrypoint.sh php-fpm

loop.sh

apt update
apt install smbclient -y
apt install sudo procps -y

[查看更多...]

来自 大脸猪 发送于 2020-02-20 17:44 - 0 条评论