Contents

Docker in Docker (DinD) 和 RabbitMQ 解決大量資料方法小記

最近做大量資料處理
我想使用 RabbitMQ 處理大量資料
不過這個方式 RabbitMQ 會遇到 Work 需要一開始常駐
不能做到自動調整控制 Work 數量
所已採用 DinD 觀念去實作

DIND 就是 Docker in Docker

1
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock docker:latest version

然後容器裡面的 Container 可以跟 docker.sock 做溝通
相關可以控制方法 (Docker )

更多 Unix-socket 方式可以參考
Engine API v1.24 | Docker Documentation
Docker Engine API v1.40 Reference

看到這個方式突然想到之前 COSCUP 有看到 Serverless 方式去做

但由於要限制 docker 執行數量
可以使用 Redis 用程式邏輯限制數量
不過要如何實作,這篇不是重點

php 使用 socket 方式連 docker

參考官網文章

1
2
3
curl --unix-socket /var/run/docker.sock -H "Content-Type: application/json" \
  -d '{"Image": "alpine", "Cmd": ["echo", "hello world"]}' \
  -X POST http:/v1.24/containers/create

發現 curl 需要 7.4 以上才有 unix-socket 連結功能
但使用 php curl 沒有這個問題

可以看到以下參考
使用前請記得 docker pull alpine

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
$file_p = stream_socket_client("unix:///var/run/docker.sock", $errno, $errstr, 30);
if (!$file_p) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($file_p, "POST /containers/create HTTP/1.1\nHost: v1.24\nContent-Type: application/json\nContent-Length: 51\nConnection: Close\n\n{\"Image\": \"alpine\", \"Cmd\": [\"echo\", \"hello world\"]}");
    while (!feof($file_p)) {
        echo fgets($file_p, 1024);
    }
    fclose($file_p);
}
?>

Connection: Close 需要加,否則程式不會退出!!
仔細想想這樣也滿有道理,需要切斷 socket 連線
Content-Length 需要注意{"Image": "alpine", "Cmd": ["echo", "hello world"]}這個長度
不對的話會有問題

最後,程式用 DinD 要如何傳值到程式裡面,這也是一個不錯思考問題
畢竟會遇到跳脫字元(\),可能使用外部資源(file,mysql,redis)會是比較安全方式

對外 socket 連結可以改成 tcp 開頭

誤打誤撞,發現這個好像不錯工具就是要你懂Unix Socket 进行抓包解析 | plantegg備份圖
就是要你懂网络监控–ss用法大全 | plantegg
就是要你懂抓包–WireShark之命令行版tshark | plantegg

衍生問題

RabbitMQ 的 worker 要如何關小保持關掉中程式可以正常結束

這個問題,我沒有在網路上爬到。
不過我自己想這個問題,在設計 worker 這條路應該要做到 已經做過尚未執行成功 中斷程式
下次執行也能應該也要正常執行才對

RabbitMQ 連續大量錯誤

如何優雅地在RabbitMQ實現失敗重試 - lala - Medium 備份圖
.net - How do I set a number of retry attempts in RabbitMQ? - Stack Overflow
其他問題想到再說

rabbitmq 持久化

有 Queue 持久化
有 Message 持久化

rabbitmq 定義 Queue 不能修改

autoack 與 max-

可能要確定 autoack = true 時候, server 馬上發送 message 給 worker ??

前言 · 轻松搞定RabbitMQ · 看云

Auto-Scaling Services Using Instrumented Metrics - Docker Flow Monitor

Spring Boot RabbitMQ - priority queue