Docker in Docker (DinD) 和 RabbitMQ 解決大量資料方法小記
最近做大量資料處理
我想使用 RabbitMQ 處理大量資料
不過這個方式 RabbitMQ 會遇到 Work 需要一開始常駐
不能做到自動調整控制 Work 數量
所已採用 DinD 觀念去實作
DIND 就是 Docker in Docker
|
|
然後容器裡面的 Container 可以跟 docker.sock 做溝通
相關可以控制方法 (Docker )
- Examples using the Docker Engine SDKs and Docker API | Docker Documentation
- 关于/var/run/docker.sock | Fundebug博客 - 一行代码搞定BUG监控 - 网站错误监控|JS错误监控|资源加载错误|网络请求错误|小程序错误监控|Java异常监控|监控报警|Source Map|用户行为|可视化重现
更多 Unix-socket 方式可以參考
Engine API v1.24 | Docker Documentation
Docker Engine API v1.40 Reference
看到這個方式突然想到之前 COSCUP 有看到 Serverless 方式去做
- Philipz Docker Lab. - Serverless 架構 & Docker
- Building serverless apps with Docker - Docker Blog
- 無伺服器架構 - 壹讀
- bfirsh/serverless-docker: Build serverless apps with Docker
- bfirsh/serverless-docker-voting-app: A serverless web app built with Docker
- 技术|用 Docker 创建 serverless 应用
但由於要限制 docker 執行數量
可以使用 Redis 用程式邏輯限制數量
不過要如何實作,這篇不是重點
php 使用 socket 方式連 docker
參考官網文章
- PHP: stream_socket_client - Manual
- Examples using the Docker Engine SDKs and Docker API | Docker Documentation
|
|
發現 curl 需要 7.4 以上才有 unix-socket 連結功能
但使用 php curl 沒有這個問題
可以看到以下參考
使用前請記得 docker pull alpine
|
|
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 ??
Auto-Scaling Services Using Instrumented Metrics - Docker Flow Monitor
Spring Boot RabbitMQ - priority queue