Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Go in production - case of Gannoy -
Search
monochromegane
October 17, 2017
Technology
560
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Go in production - case of Gannoy -
fukuokago#9
https://connpass.com/event/68358/
monochromegane
October 17, 2017
More Decks by monochromegane
See All by monochromegane
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
280
適応的スパムフィルタのための軽量な類似メッセージカウンタ / jsai2026-adaptive-spam-filter
monochromegane
0
5.9k
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
3
920
Claude Codeセッション現状確認 2026福岡 / fukuoka-aicoding-00-beacon
monochromegane
4
810
Go言語での実装を通して学ぶLLMファインチューニングの仕組み / fukuokago22-llm-peft
monochromegane
0
310
不確実性下における目的と手段の統合的探索に向けた連続腕バンディットの応用 / iot70_gp_rff_mab
monochromegane
2
580
なめらかなシステムと運用維持の終わらぬ未来 / dicomo2025_coherently_fittable_system
monochromegane
0
52k
ベクトル検索システムの気持ち
monochromegane
38
13k
Go言語での実装を通して学ぶ、高速なベクトル検索を支えるクラスタリング技術/fukuokago-kmeans
monochromegane
1
340
Other Decks in Technology
See All in Technology
3つのアプローチで目指す チームを強くするAI駆動開発
thkt
0
150
スキルを作る、その前に!複数人で使われるスキルを 作るためのプロセス
junkifurukawa
2
370
脆弱性診断って、何をしているの? 〜弱点を見つけて、会社の改善につなげるまで〜
keeg
0
790
IoTデバイスを繋げるプロトコルMatterをAndroidで使用する方法
harutiro
0
120
子育てエンジニアの可処分時間が減っても成長を諦めない戦い方
sudoakiy
6
4.3k
Claude Code本は、どのように執筆チームで書かれたか
oikon48
1
350
12 個 Tool と、 4,096 Token
hlum
0
110
freeeらしさをAIとともに作る / Creating the freee Experience with AI
ymrl
0
220
事業活動を AI Ready にする攻めと守りのデータエンジニアリング / data-engineering-for-ai-ready-business
pei0804
7
2.4k
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
340
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
320
LLM機能を自作して分かるSnowflake Cortex AIの強み
nayuts
0
340
Featured
See All Featured
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
400
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
270
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
310
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Crafting Experiences
bethany
1
380
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
570
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
710
Fantastic passwords and where to find them - at NoRuKo
philnash
53
4k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
320
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
350
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
540
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.9k
Transcript
- case of Gannoy - ࡾ༔հ / Pepabo R&D Institute,
GMO Pepabo, Inc. 2017.10.17 Fukuoka.go#9 Go in production
ϓϦϯγύϧΤϯδχΞ ࡾ ༔հ / @monochromegane 2 http://blog.monochromegane.com Yusuke Miyake ϖύϘݚڀॴ
ݚڀһ
1. Goຊ൪ӡ༻ͷཁ݅ 2. Goຊ൪ӡ༻ͷ࣮ݱ 3. ·ͱΊ 3 ࣍
1. GannoyʹΈΔ Goຊ൪ӡ༻ͷཁ݅
Gannoy Approximate nearest neighbor search server and dynamic index written
in Golang. https://github.com/monochromegane/gannoy
Similar images search system using Gannoy 6 Features Similar items
Gannoy [2048]float64 query by http find similar features mapping similar features to items response Deep CNN index Features [2048]float64 Deep CNN register by http
• HTTP based Approximate nearest neighbor search server • Using
labstack/echo • Go 1.8+ 7 Gannoy
Goຊ൪ӡ༻ͷཁ݅
• Graceful restart • Daemonize • Monitoring • Log rotation
9 Goຊ൪ӡ༻ͷཁ݅ • Configuration • Build • Deploy
2. GannoyʹΈΔ Goຊ൪ӡ༻ͷ࣮ݱ
Graceful restart 11 go-server-starter + http.Server#Shutdown() import "github.com/lestrrat/go-server-starter/listener" e :=
echo.New() listeners, err := listener.ListenAll() if err != nil && err != listener.ErrNoListeningTarget { fmt.Fprintln(os.Stderr, err) os.Exit(1) } e.Listener = netutil.LimitListener(listeners[0], opts.MaxConnections) Listen from start_server socket.
Graceful restart 12 go-server-starter + http.Server#Shutdown() go func() { if
err := e.Start(""); err != nil { e.Logger.Info("Shutting down the server") } }() sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, sig) <-sigCh ctx, cancel := context.WithTimeout(context.Background(), time.Duration(opts.ShutDownTimeout)*time.Second) defer cancel() if err := e.Shutdown(ctx); err != nil { e.Logger.Fatal(err) } Start server as goroutines. Wait SIGTERM. Graceful shutdown using http.Server.
Daemonize 13 Systemd [Unit] Description=Gannoy DB ConditionPathExists=/usr/bin/start_server ConditionPathExists=/usr/bin/gannoy-db After=network.target [Service]
User=gannoy Group=gannoy Type=simple PIDFile=/var/run/gannoy/server_starter.pid ExecStart=/usr/bin/start_server --port 8080 --pid-file /var/run/gannoy/server_starter.pid -- / usr/bin/gannoy-db -c /etc/gannoy/gannoy-db.toml ExecReload=/bin/kill -HUP $MAINPID ExecStop=/bin/kill -TERM $MAINPID [Install] WantedBy=multi-user.target gannoy-db.service
Monitoring 14 health-check endpoint + Consul e.GET("/health", func(c echo.Context) error
{ return c.NoContent(http.StatusOK) }) { "service": { (snip) "port": 80, "checks": [ { "script": "/usr/bin/check-http -u http://localhost/health", "interval": "30s" } ] } } health-check endpoint consul.d/gannoy.json
Log ratation 15 logrotate /var/log/gannoy/gannoy-db.log { daily rotate 7 missingok
notifempty compress postrotate kill -HUP `cat /var/run/gannoy/server_starter.pid` endscript } gannoy-db.logrotate reopen logfile.
Configuration 16 monochromegane/conflag // Parse option from args and configuration
file. conflag.LongHyphen = true conflag.BoolValue = false parser := flags.NewParser(&opts, flags.Default) _, err := parser.ParseArgs(os.Args[1:]) if err != nil { os.Exit(1) } if opts.Config != "" { if args, err := conflag.ArgsFrom(opts.Config); err == nil { if _, err := parser.ParseArgs(args); err != nil { os.Exit(1) } } } _, err = parser.ParseArgs(os.Args[1:]) if err != nil { os.Exit(1) } Read option from config. Overwrite option from args. data-dir = "/var/lib/gannoy" log-dir = "/var/log/gannoy" lock-dir = "/var/run/gannoy" server-starter = true auto-save = true gannoy-db —data-dir=“data”
Configuration 17 monochromegane/conflag http://blog.monochromegane.com/blog/2015/05/30/conflag/
Build 18 rpmbuild + docker-compose . !"" Dockerfile.rpmbuild !"" docker-compose.yml
!"" rpmbuild # !"" RPMS # # $"" x86_64 # # $"" gannoy-0.0.1-8.x86_64.rpm # !"" SOURCES # # !"" gannoy-db.logrotate # # !"" gannoy-db.service # # $"" gannoy-db.toml # $"" SPECS # $"" gannoy.spec $"" version.go version: '2' services: gannoy-rpmbuild: build: context: . dockerfile: Dockerfile.rpmbuild command: cp /root/rpmbuild/RPMS/x86_64/ gannoy-0.0.1-8.x86_64.rpm /tmp/rpmbuild/RPMS/ x86_64/. volumes: - .:/tmp:rw RUN rpmbuild -bb /root/rpmbuild/SPECS/gannoy.spec $ docker-compose build gannoy-rpmbuild $ docker-compose run gannoy-rpmbuild docker-compose.yml Dockerfile.rpmbuild
Deploy (and test) 19 Puppet + Serverspec class gannoy::install {
include ::go_start_server $rpm = 'gannoy-0.0.1-8.x86_64.rpm' file { "/usr/local/src/${rpm}": ensure => present, source => "puppet:///modules/gannoy/${rpm}", mode => '0755', owner => 'root', notify => Package['gannoy'], } -> package { 'gannoy': ensure => '0.0.1-8', source => "/usr/local/src/${rpm}", provider => rpm, } (snip) } (snip) describe service('gannoy-db') do it { should be_enabled } end describe package('gannoy') do it { should be_installed.with_version('0.0.1-8') } end (snip)
·ͱΊ
• σʔϞϯԽ͕ඞཁͳGoΞϓϦͷຊ൪ӡ༻όΠφϦҎ֎ʹඞཁͳ ϑΝΠϧ͕͋ΔͷͰύοέʔδϯάͨ͠΄͏͕औΓճָ͕͠ • ΦϓγϣϯͱઃఆϑΝΠϧͷڞ௨Խʹconflag͕ศར • ϕετϓϥΫςΟεࡧதɻσΟεΧογϣϯ͠·͠ΐ͏ɻ 21 ·ͱΊ
ݚڀһɺੵۃతʹืूதʂ http://rand.pepabo.com/