묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨대용랑 채팅 TPS에 대한 stateful 서비스 구축하기
컨트롤 서버가 다운되면 어떻게 되나요?
[이 강의에서 다룰 zero-downtime-deploy를 위한 아키텍처 구조도를 알려드릴게요] 강의를 들으면서 컨트롤 서버의 필요성에 대해 설명해주셨습니다. 채팅 서버 1,2,3 이 다운될 때를 고려해서 로드 밸런싱 용으로 컨트롤 서버를 따로 둔다고 이해했는데, 컨트롤 서버가 배포되거나 다운되는 경우는 없을까요? 컨트롤 서버도 이중화로 구성을 해야하는 것인지, 다른 방법은 무엇이 있는지 궁금합니당
-
미해결대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
채팅 메시지 DB로 저장 하기.
안녕하세요.강의 잘 들었습니다.마지막에 메시지를 저장 하는 얘기를 하셨는데.. 보통 메신저 서비스에서는 어떤 방식의 DB를 사용하는지궁금합니다. 흔히 Oracle이나 MariaDB 같은 방식의 관계형 DB를 사용하는게 흔한지 아니면 Mongo같은 비관계형 방식의 DB를 많이 사용하는지 혹시 답변이 가능하시다면 답변 부탁 드립니다. 그리고 그걸 선택한 이유가 무엇인지. 감사합니다.
-
해결됨대용랑 채팅 TPS에 대한 stateful 서비스 구축하기
1탄과 2탄 사이 변경된 코드 질문
안녕하세요! 지난 1탄 강의 잘 들었습니다.다름이 아니라 1탄과 2탄에서 go로 작성된 코드가 조금 다른거 같은데 혹시 누락된 강의가 있는걸까요 ?1탄에선 network 디렉토리에 network.go와 socket.go만 작성했었는데 2탄에선 server.go와 util.go가 생기면서 코드가 조금 변경된거 같습니다.누락된 강의가 없다면, 변경된 부분이 어떤 것들인지 알고싶어서 질문드립니다.
-
해결됨대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
채팅이 2번씩 전송되는 현상 질문
안녕하세요 go 서버 구축 이후 프론트 연결하여 채팅을 전송하면 같은 메시지가 두 번씩 전송되는 현상이 발생합니다.강의를 여러 번 체크하면서 봤는데 소스 코드가 다른 점은 찾지 못했습니다. 제가 작성한 socket.go 코드인데 어떤 부분이 문제가 있을까요package network import ( "chat_server_golang/types" "log" "net/http" "time" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) var upgrader = &websocket.Upgrader{ReadBufferSize: types.SocketBufferSize, WriteBufferSize: types.MessageBufferSize, CheckOrigin: func(r *http.Request) bool {return true}, } // http 요청을 websocket 통신으로 업그레이드 해준다. type message struct { Name string Message string Time int64 } type Room struct { Forward chan *message Join chan *client Leave chan *client Clients map[*client]bool } type client struct { Send chan *message Room *Room Name string Socket *websocket.Conn } func NewRoom() *Room { return &Room { Forward: make(chan *message), Join: make(chan *client), Leave: make(chan *client), Clients: make(map[*client]bool), } } func (c *client) Read() { // 클라이언트가 들어오는 멧세지를 읽는 작업 defer c.Socket.Close() for { var msg message err := c.Socket.ReadJSON(&msg) if err != nil { if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway) { break } panic(err) } else { log.Println("READ : ", msg, "client", c.Name) log.Println() msg.Time = time.Now().Unix() msg.Name = c.Name c.Room.Forward <- &msg } msg.Name = c.Name c.Room.Forward <- &msg } } func (c *client) Write() { // 클라이언트가 나가는 메시지를 전송하는 작업 defer c.Socket.Close() for msg := range c.Send { log.Println("WRITE : ", msg, "client", c.Name) log.Println() err := c.Socket.WriteJSON(msg) if err != nil { panic(err) } } } func (r *Room) RunInit() { // room 에 있는 모든 채널 값을 받는 작업 // join leave 등의 메시지 큐를 처리, 무한반복문을 돌면서 처리 for { log.Println(r.Clients) log.Println(r.Forward) select { case client := <-r.Join: r.Clients[client] = true case client := <-r.Leave: r.Clients[client] = false close(client.Send) delete(r.Clients, client) case msg := <-r.Forward: for client := range r.Clients { client.Send <- msg } } } } func (r *Room) SocketServe(c *gin.Context) { socket, err := upgrader.Upgrade(c.Writer, c.Request, nil) if err != nil { panic(err) } userCookie, err := c.Request.Cookie("auth") if err != nil { panic(err) } log.Println("userCookie", userCookie) client := &client{ Socket: socket, Send: make(chan *message, types.MessageBufferSize), Room: r, Name: userCookie.Value, } r.Join <- client // 채팅방에 클라이언트가 들어왔다고 알림 defer func() { r.Leave <- client }() // 클라이언트가 나갔다고 알림, 클라이언트가 나가면서 defer 함수가 실행된다. go client.Write() client.Read() }2024/05/20 01:39:17 userCookie auth=one 2024/05/20 01:39:17 map[0x14000512600:true] 2024/05/20 01:39:17 0x14000192600 2024/05/20 01:39:21 READ : { hi 0} client one 2024/05/20 01:39:21 2024/05/20 01:39:21 map[0x14000512600:true] 2024/05/20 01:39:21 0x14000192600 2024/05/20 01:39:21 map[0x14000512600:true] 2024/05/20 01:39:21 0x14000192600 2024/05/20 01:39:21 WRITE : &{one hi 1716136761} client one 2024/05/20 01:39:21 2024/05/20 01:39:21 WRITE : &{one hi 1716136761} client one 2024/05/20 01:39:21
-
해결됨대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
뭔가 중간에 오타를 쳤는지 오류가 자꾸 발생하는데 혹시 go 소스코드 볼수있는곳 있나요?
뭔가 중간에 오타를 쳤는지 오류가 자꾸 발생하는데 혹시 go 소스코드 볼수있는곳 있나요?
-
해결됨대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
다른 질문을 읽고 궁금한 점이 생겼습니다.
https://www.inflearn.com/questions/1229435/%EC%86%8C%EC%BC%93-%EC%84%9C%EB%B2%84%EC%9D%98-%EC%88%98%ED%8F%89%EC%A0%81-%ED%99%95%EC%9E%A5-%EB%B0%8F-%EB%AC%B4%EC%A4%91%EB%8B%A8-%EB%B0%B0%ED%8F%AC%EC%97%90-%EB%8C%80%ED%95%B4-%EC%A7%88%EB%AC%B8%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4?re_comment_id=330648위 질문의 답으로 써주신 내용중에 궁금한 점이 있습니다.>>> 그리고 실질적으로 Client측에서 곧바로 Socket에 붙는 경우는 없습니다.라고 강사님이 답변을 주셨던데, 이번 강의에서는 클라이언트(리액트)에서 소켓서버(golang gin)에 직접 연결을 맺은 것으로 이해했습니다. 강의이기 때문에 중간에 이벤트 툴이 생략된거라 생각하면 될까요..? 추가적으로 클라이언트에서 소켓에 직접 커넥션을 맺지 않고, 사용가능한 socket URL을 받아 연결을 한다고 하셨는데 이 socket Url 의 존재에 대해 더 알고 싶습니다. 이게 단순히 스프링으로 따지면 controller 에 할당되는 매핑정보 같은 url 을 말하는 걸까요?
-
해결됨대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
소켓 서버의 수평적 확장 및 무중단 배포에 대해 질문드립니다!
안녕하세요, 소켓 서버의 수평적 확장 및 무중단 배포에 대해 궁금한 점이 있어 질문드립니다. 🙂state를 갖고 있는 소켓 서버의 특징으로 인해 수평적 확장이 쉽지 않을 것 같은데요, 하지만 scale up 자체는 한계가 있기 때문에 강의의 주제처럼 대용량의 소켓 서버를 만드려면 결국 여러 대의 소켓 서버를 활용해야 할 것으로 예상됩니다.그렇다면 실무에서는 어떤 방식으로 소켓 서버를 scale out 하게 되는지 궁금합니다! go 혹은 node 서버 진영에서 사용되는 프레임워크나 방식이 있을까요? 또한, 강의에서 보여주신 소켓 서버 예시는 connection를 메모리에 들고 있기 때문에 서버를 종료하게 될 경우, 기존의 소켓 채널이 모두 닫히게 될 것 같아요! 혹시 소켓 서버의 무중단 배포를 하고 싶다면, 어떤 식으로 작업을 구성하게 되는지도 궁금합니다.감사합니다! 🙏
-
해결됨대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
app.js를 여러 번 실행했음에도 불구하고, 로그가 단 한 번만 출력됨
app.js를 여러 번 실행했음에도 불구하고, 로그가 단 한 번만 출력됩니다. 포트 충돌 문제인가 해서 8080 포트 죽여보고 9090으로 바꿨는데도 안됩니다. ㅜ[winston을 통한 로깅 설정 및 서버 시작하기] 수강 중입니다.
-
해결됨대용량 채팅 TPS 처리를 위한 웹소켓 통신 만들며 학습하기
몇천명이 Room 에 동시접속할 수 있도록 설계하려면 어떤 것들이 필요할까요?
안녕하세요!저는 웹소켓 개발은 해본적이 없는데 흥미로운 주제로 강의를 하셔서 강의를 듣고 있는데요,예제에서는 간단하게 2명의 client 의 경우를 보여주셨는데 실제스트리밍 방송에는 몇천명씩 들어와서 채팅을 하는데 그럴 경우에는 SocketBufferSize 를 늘려주면 되는건가요?그런식으로 확장해야할 때 어떻게 설계해야하는지 궁금합니다!
-
미해결비전공자의 전공자 따라잡기 - 네트워크, HTTP
301 리다이렉트 관련 질문입니다!
만약, 리액트를 사용한다고 하면 서버에서 301로 응답이 왔을 때 프론트에서 useNavigation() 훅을 이용해서 응답에 맞게 이동시켜야 하나요?
-
해결됨비전공자의 전공자 따라잡기 - 네트워크, HTTP
Access-Control-Allow-Origin 헤더가 없는데 CORS에러가 안나는 이유
영상에서 6분쯤에 Access-Control-Allow-Origin 헤더가 없는데 cors에러가 안나는 경우로 interpark 요청에 응답 헤더를 예시로 보여주셨고 이후에 simple request 에 대해 설명해 주셨습니다. 그런데 찾아보니 해당 헤더가 없으면 simple request더라도 요청이 막히는 것 같습니다. 그렇다면 interpark의 경우는 어떤 방식으로 해당 헤더 없이 요청이 성공했는지 궁금합니다.
-
미해결비전공자의 전공자 따라잡기 - 네트워크, HTTP
목적지 라우터 찾는 과정 질문
라우팅테이블을 통해 목적지 라우터를 찾아갈 때 현재 위치와 목적지의 물리적인 거리가 멀다면 HTTP 요청을 주고받는 시간도 늘어나는 게 맞을까요?
-
해결됨비전공자의 전공자 따라잡기 - 네트워크, HTTP
응답, 요청에 따라 유동적으로 서버, 클라이언트가 바뀌는 경우도 있을까요?
안녕하세요 제로초님 강의 잘 듣고 있습니다!강의를 듣다 문득 궁금한 게 생겼는데요a에서 요청하고 b에서 응답하면 a가 클라이언트 b가 서버인데다시 b가 요청하고 a가 응답해서 서버, 클라이언트 역할이 바뀌는 경우도 있나요? 갑자기 궁금해져서 질문 남깁니다
-
미해결비전공자의 전공자 따라잡기 - 네트워크, HTTP
OSI 7 계층 전체 프로세스 작동 방식
물리->데이커링크->네트워크->트랜스포트->세표응 이런 일련의 과정을 CHUNK로 봤을 때 예를 들어 클라이언트->서버로 보낼 때 물리부터 세표응까지 한번 일어나고 다시 서버-> 클라이언트로 갈 때 다시 물리부터 세표응까지의 과정이 일어나나요?궁금합니다..
-
미해결비전공자의 전공자 따라잡기 - 네트워크, HTTP
what is my ip
시스템설정 -> 네트워크탭 -> 이더넷에 나와있는 IP 주소 192.168 ~ 은 공유기에서 사용하는 사설 IP이고, Google 에서 what is my ip 라고 치면 나오는 IP 가, 내 공인 IP라고 보면 되는걸까요??
-
해결됨비전공자의 전공자 따라잡기 - 네트워크, HTTP
안녕하세요. 궁금한게 있습니다.
안녕하세요. 궁금한게 있습니다.원 서버보다 리버스 프록시가 정적 파일 서빙해주는 역할이나 압축 같은 것을 더 잘한다 하셨는데 이때 각각 특화된 프록시를 사용하는 것인가요? 아니면 프록시에서 압축, 정적파일 서빙 등 모든 일을 다 하는데 원 서버보다 더 빠른것인지 궁금합니다.또한 API Gateway도 Proxy라 하셨는데 관련 내용을 못찾고 있어서요ㅠㅠ 혹시 어떻게 검색하면 관련 문서를 볼수 있을지도 궁금합니다.항상 감사합니다.
-
해결됨비전공자의 전공자 따라잡기 - 네트워크, HTTP
내 라우터에서 IP 부분을 떼었다가 붙이는 이유
안녕하세요 제로초님.5분 32초에 내 라우터에서 IP부분을 떼었다가 다시 붙여준다는 말씀을 하셨는데, 이미 네이버 IP를 목적지 IP로 갖고 있는데도 떼는 이유가 무엇인지, 떼었다가 붙였다가 하는 것은 케이스 마다 다르게 행해지는 것인지 궁금합니다.그리고 떼었다가 붙인다면 어떤 정보가 붙는건지 알려주시면 감사하겠습니다😊계속 강의를 보다보니 질문이 늘어나네요..ㅎㅎ+ 내 라우터가 인터넷을 통해서 네이버 라우터IP 주소를 아는 방법은 라우팅 테이블이라는 방법으로 물어물어 IP주소를 알게된다고 하셨는데, 내 컴퓨터는 네이버 IP를 DNS를 통해서 이미 알고있다고 하셨는데 왜 물어물어 가는건지도 설명해주시면 감사하겠습니다!
-
해결됨비전공자의 전공자 따라잡기 - 네트워크, HTTP
내 라우터에서 naver 라우터까지 전송과정 질문
3분 35초쯤 보면 내 라우터가 naver 라우터의 MAC주소를 알기때문에 목적지MAC주소에 naver MAC주소가 담겨서 간다고 하셨습니다이전 강의까지 배우기로는 내 라우터 안에 있는 스위치와 각 기기들간에는 MAC주소로 전송을 하고 내 라우터와 다른 라우터들 사이에서는 ip주소를 통해서 전송을 한다고 들었는데 뭐가 맞는건지 헷갈립니다라우터끼리의 데이터 전송에서 MAC주소도 사용되고 IP주소도 사용되는건가요?내 라우터는 다른 라우터들의 MAC주소를 다 알고있나요?
-
해결됨비전공자의 전공자 따라잡기 - 네트워크, HTTP
강의명 데이터의 전체 흐름에서 라우터간 주소 획득 과정 질문드립니다.
제가 이해한 바가 맞는지 궁금해서 질문드립니다.내 라우터에서 네이버 라우터의 MAC주소를 알기 위해서 인터넷을 통해 옆 사람에게 묻는 방식으로 네이버 IP가 있는 곳까지 가서 MAC주소를 얻어온다.이렇게 이해하는 것이 맞을까요?6분 대에 설명하신 것에 라우팅 테이블이 네이버 라우터의 IP를 찾아온다고 하셨습니다. 그런데 네이버 IP는 맨 처음부터 알고 있으니까 MAC주소를 얻어오는 것이 맞는 것 같은데 어떻게 이해하면 좋을까요? 감사합니다.
-
해결됨비전공자의 전공자 따라잡기 - 네트워크, HTTP
네트워크계층 제가 이해한게 맞나요?
101동 아파트를 생각한다고 했을 때 각 세대마다 기기들(컴퓨터 등)의 MAC주소가 있는데 이런 MAC주소들이 스위치에 모이게되고 스위치도 MAC주소를 가지고 있다. 101동 아파트 전체의 스위치들이 하나의 라우터에 모이고 스위치들이 모인 라우터를 네트워크라고 부르며 IP주소를 가지고 있다. 여기까지 제가 이해한 내용이 맞나요? 그렇다면 101동 주민들의 네트워크 IP주소는 모두 똑같다는 말인가요?