When collectors are running in cluster mode, collector must discovery each other in some way. In default, SkyWalking uses
Zookeeper to coordinate and as register center for instance discovery.
Through the above section([Multiple connection ways](#multiple-connection-ways)), client lib will not use the Zookeeper to find cluster. And we suggest the client shouldn't do it in that way. Because the cluster discovery mechanism is switchable,
provided by modulization core. Relying on that breaks the switchable capability.
We hope the community provides more implementor to do cluster discovery, such as Eureka, Consul, Kubernate.
## Streaming Mode
Streaming mode likes a lightweight storm/spark implementation, which allows using APIs to build streaming process graph(DAG),
and the input/output data contracts of each node.
New module can find and extend the existed process graph.
1. Asynchronizing process, a.k.a batch process based on Queue buffer.
1. Remote process. Aggregate metrices across collector. In that way, selector is defined in node to decide
how to find the collector in cluster. (HashCode, Rolling, ForeverFirst are the three ways supported)
By having these features, collector cluster runs like as a streaming net, to aggregate the metrics and don't rely on the
storage implementor to support writing the same metric id concurrently.
## Swtichable Storage Implementors
Because streaming mode takes care of the concurrent, storage implementor responsibilities are provide high speed write,
and group query.
Right now, we supported ElasticSearch as primary implementor, H2 for preview, and MySQL Relational Database cluster managed
by ShardingShpere project.
# Web UI
Besides the principles in collector design, UI is another core component in SkyWalking. It is based on React, Antd and Zuul
proxy to provide collector cluster discovery, query dispatch and visualziation.
Web UI shares the similiar process flow as client's `1.naming then 2.uplink` mechanism in [Multiple connection ways](#multiple-connection-ways) section. The only difference is that, replace the uplink with GraphQL query protocol in HTTP binding at the host and port under `ui/jetty/` in yaml definition(default:`localhost:12800`).