Slackのバックエンドについて少し調べてみた

# 元ネタ
[What is the tech stack behind Slack? - Quora]
(https://www.quora.com/What-is-the-tech-stack-behind-Slack)
Slackのバックエンドが何で出来ているのかをCTO（Cal Henderson）が答えてくれています。

ここに記載されているソフトウェアについて、知らないものが多かったので、「〇〇とは？」形式で調べてみました。

※自分が知っているものについては名前のみを記載しています。

# クライアントアプリ
### web client
JavaScript
ES6
React

### desktop app
Electron

### Android
Java 
Kotlin

### iOS
Objective C
Swift

# slack.comのバックエンド（webサーバー周りとAPI）

### アプリケーション

#### PHP + Hack + HHVM
要するにPHPでできてるみたいです。

HackやHHVMはPHP関連の便利ツールだそうです。

##### Hack

[新言語Hackで最強PHPerになろう！ - Qiita](https://qiita.com/yone098@github/items/7ff3616030e8d19400a7)

> HHVM 向けの開発言語で静的型付き言語の性質を取り入れ PHP での素早い開発を実施し、PHPとの互換性があります

##### HHVM

[HHVM(HipHop Virtual Machine)/Hackとは - Qiita](https://qiita.com/azurite@github/items/1a7b58c2898aac34a7d0)

> HHVM(HipHop Virtual Machine)とは、Facebookが開発・公開しているC++で実装されたPHP実行環境（JITコンパイラ）の一つです。

### データ保存

#### MySQL + Vitess
要するにMySQLを使っているみたいです。

##### Vitess

[MySQL + Kubernates = Vitess ? Vitessをインストールしてみよう！ | スマートスタイル TECH BLOG｜データベース＆クラウドの最新技術情報を配信](https://www.s-style.co.jp/blog/2019/04/3855/)

> MySQLインスタンスの大規模クラスタをデプロイ、拡張、管理するためのデータベースソリューションです。

### キャッシュ

#### Memcached + MCRouter

要するにMemcachedを使っているみたいです。

##### Memcached

[今更ではあるが、memcachedについて学習してみた - Qiita](https://qiita.com/juve_534/items/54f7732641a406f31b55)
> memcachedとは分散型キャッシュシステムを構築することができるソフトウェアである。

##### MCRouter
[mcrouterでElastiCache(memcached)を分散レプリケーションする ｜ DevelopersIO](https://dev.classmethod.jp/cloud/aws/elasticache-carried-mcrouter/)

「mcrouterはmemcachedプロトコルをルーティングするソフトウェアで、クライアントとmemcachedサーバの間に立ってクエリをルーティングする仕組みになっています。」

### 検索


#### SolrCloud

[元ネタ内](https://www.quora.com/What-is-the-tech-stack-behind-Slack)

> with various Java services for ranking

[検索システムだって高可用性にしたい！SolrCloudを用いた高可用性構成の紹介 - ZOZO Technologies TECH BLOG](https://techblog.zozo.com/entry/solr_cloud)

> 全文検索や、ファセット機能などはMySQLだけでは不十分なために、Solrを併用しています。

> Solrのサーバー構成例にはいくつかのパターンがありますが、今回はその中でも最も可用性の高いSolrCloud...

### リアルタイムメッセージ

WebSockets
Java
Go

### ロードバランサ
#### HAproxy

[元ネタ内](https://www.quora.com/What-is-the-tech-stack-behind-Slack)

> for load balancing

[HAProxyを使い始めてみる - Qiita](https://qiita.com/saka1_p/items/3634ba70f9ecd74b0860)

> 多機能なプロキシサーバです。

#### Consul

[Consul by HashiCorp ～サービス・ディスカバリ入門～ - Qiita](https://qiita.com/zembutsu/items/1e4424314a0ad98bcc40)

> インフラ上のサービス設定とサービスディスカバリのためのツール

### 通信プロトコル

#### gRPC

[gRPCって何？ - Qiita](https://qiita.com/oohira/items/63b5ccb2bf1a913659d6)

> gRPC は、RPC (Remote Procedure Call) を実現するためにGoogleが開発したプロトコルの1つです。

#### RPC

[遠隔手続き呼出し - Wikipedia](https://ja.wikipedia.org/wiki/%E9%81%A0%E9%9A%94%E6%89%8B%E7%B6%9A%E3%81%8D%E5%91%BC%E5%87%BA%E3%81%97)

> 遠隔手続き呼出し（英: remote procedure call、リモートプロシージャコール、略してRPC）とは、プログラムから別のアドレス空間（通常、共有ネットワーク上の別のコンピュータ上）にあるサブルーチンや手続きを実行することを可能にする技術。

#### Thrift
[Apache Thrift - Wikipedia](https://ja.wikipedia.org/wiki/Apache_Thrift)

> Apache Thrift（アパッチ スリフト）は、「スケーラブルな言語間サービス開発」のためにFacebookにて開発された遠隔手続き呼出し (RPC) フレームワークである。

#### JSON-over-HTTP
[JSON-RPC over HTTPなサーバを作る - Qiita](https://qiita.com/niku4i/items/bdef1e360729042673ad)

> JSON-RPC over HTTP

### 音声・ビデオ通信サービス

#### Elixir

[元ネタ内](https://www.quora.com/What-is-the-tech-stack-behind-Slack)

> voice and video calling service

 [Elixir (プログラミング言語) - Wikipedia](https://ja.wikipedia.org/wiki/Elixir_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E))
 
> Elixir (エリクサー) は並行処理の機能や関数型といった特徴を持つ、Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語である。

### その他

#### Node

[元ネタ内](https://www.quora.com/What-is-the-tech-stack-behind-Slack)

> A few different services

### 非同期タスクキュー

#### Kafka

[Apache Kafkaの概要とアーキテクチャ - Qiita](https://qiita.com/sigmalist/items/5a26ab519cbdf1e07af3)

> Apache Kafka（以降、Kafka）はスケーラビリティに優れた分散メッセージキューです。

#### Redis

# 大規模データ分析

### 処理ツール

#### Presto

[HiveとPrestoの違いについて調べてみた - Qiita](https://qiita.com/haramiso/items/122d4ea0e5660e0b4e41)
 
> 分散型SQLクエリエンジン

> あらゆる大きさのデータサイズに対しても、インタラクティブ（対話的）な処理が可能

#### Spark
 
[Apache Spark で分散処理入門 - Qiita](https://qiita.com/Hiroki11x/items/4f5129094da4c91955bc)
 
> Sparkは巨大なデータに対して高速に分散処理を行うオープンソースのフレームワーク。

#### Airflow
 
[【Airflow】最近よく聞くAirflowに入門！EC2で動かしてみた【CI/CD】 - Qiita](https://qiita.com/chan-p/items/526bbed95fdc73142c59#whats-airflow-)

> Airflowはプログラムでワークフローを作成、スケジュール設定、監視するためのプラットフォームである

> ETL周りをGUIベースで実行・管理をサポートしてくれるツールのようです。

#### Hadoop

[Hadoopとは - Qiita](https://qiita.com/uenohara/items/8d71ce907886422734e2)

> Hadoopは、テキスト、画像、ログなどの構造化されていないデータを、高速に処理出来るオープンソースのプラットフォームです

#### Kafka
 
[Apache Kafkaの概要とアーキテクチャ - Qiita](https://qiita.com/sigmalist/items/5a26ab519cbdf1e07af3)
 
> Apache Kafka（以降、Kafka）はスケーラビリティに優れた分散メッセージキューです。

### サーバー設定・管理

#### Terraform

[https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73](https://qiita.com/Chanmoro/items/55bf0da3aaf37dc26f73)

> インフラストラクチャ定義ツール に分類されるツールで、クラウド上のリソースを定義ファイルの状態になるように生成・操作してくれます

> Vagrant を開発している HashiCorp社 が開発しているツールなので使用感は Vagrant と同じような感じです

#### Chef

[サーバー設定ツール「Chef」の概要と基礎的な使い方 | さくらのナレッジ](https://knowledge.sakura.ad.jp/867/)

> ファイルに記述した設定内容に応じて自動的にユーザーの作成やパッケージのインストール、設定ファイルの編集などを行うツール

#### Kubernetes
 
[今さら人に聞けない Kubernetes とは？ - Qiita](https://qiita.com/MahoTakara/items/85096f8b2632c802ab22)

> Kubernetesを一言で言うと、自動デプロイ、スケーリング、アプリ・コンテナの運用自動化のために設計されたオープンソースのプラットフォームです。

#### Prometheus

[元ネタ内](https://www.quora.com/What-is-the-tech-stack-behind-Slack)

> for time series metrics

[10分で理解する Prometheus - Qiita](https://qiita.com/Chanmoro/items/ac0eb1bf93760566b338)

> SoundCloud が中心になって開発しているプル型のリソース監視ソフトウェアです

#### ELK

[元ネタ内](https://www.quora.com/What-is-the-tech-stack-behind-Slack)

> for logging

[ELK スタック | AWS](https://aws.amazon.com/jp/elasticsearch-service/the-elk-stack/)

> ELK スタックは、Elasticsearch、Logstash、Kibana という 3 つのポピュラーなオープンソースプロジェクトからなるスタックで、それぞれの頭文字を取ってこう呼ばれます。

# クラウド

[元ネタ内](https://www.quora.com/What-is-the-tech-stack-behind-Slack)

> Slack is largely hosted in AWS, in many regions globally