/gochat

Primary LanguageGo

Distributed Go Chat

Why this project?

I'm growing interest in building highly concurrent distributed web applications that can serve millions of users. There are so many technologies and resources. I think the best way to learn them is by building something so that I will be able to use them when needed.

Target

Functional requirements:

  • User register, login.
  • One to one chat room.
  • Deliver messages in real time.
  • Restore chat history when a conversation starts.

Non functional requirements:

  • Easy horizontal scaling in the server layer.

High Level Design

This is the high level design that I am trying to achieve.

high level

Resources

gPRC

Official Language Guide of protocol buffers(https://developers.google.com/protocol-buffers/docs/proto3): You should always check the official document first.

Protobuf Uber V1 Style Guide: Google provides a Style Guide. But I think Uber's is easier to follow.

gRPC Quick Start & Basics tutorial: Hands-on exercise with gRPC.

Go Generated Code: I was quite confused with the protoc and how to manage generated code at first. But after reading this doc, things become much more clear.

Error Handling: It contains sample code about using status and codes in client and server.

Websocket

System Design

A high level design of distributed systems.

TCP/IP

Although it's not directly related, I found that getting a better understanding of TCP/IP protocols helps to understand web technologies much better.

TCP/IP Guide: I highly recommend this book. It covers everything I need to understand how the Internet works in a very easy to understand way.

TCP Fundamentals - Wireshark Talks at Sharkfest Part 1 & Part 2: Seeing how the packages are passed around the network really helps me a lot to understand things I read from the book. The lecturer has some hands-on courses on Pluralsight. Very high quality. You can find them in the description of his videos.