(애플리케이션개발) 개발일지

*AMQP, MQTT, STOMP 비교글
http://blogs.vmware.com/vfabric/2013/02/choosing-your-messaging-protocol-amqp-mqtt-or-stomp.html


*JMS는 자바 EE환경에서 메시징을 보내는 가장 먼저 떠오르는 환경이지만 톰캣 설치에 라이브러리를 추가해야 하고 톰캣 구성을 광범위하게 수정해야
하기 때문에 톰캣과 같은 서블릿 전용 컨테이너나 독립형 애플리케이션에서는 구성하기가 아주 까다롭다는 문제점이 있다.




*처음에는 객체를 전송하기 위해서 Serializable를 이용했지만 Parcelable로 바꿔서 객체를 전송시키니 속도가 증가,
그 이유는 개발자가 직접 세팅을 하기 때문이다.



*세션유지, 쿠키설정 중요하게 여길것(자동로그인)
*개인정보를 수정하는 부분은 전부 Interceptor로 세션유지를 확인한다.

*서버로부터 개인 프로필 이미지를 가져올때( 이미지는 MySQL에 서버에 저장해 둔다??????)
-->디비서버에는 이미지에 대한 메타정보만 저장해둔다.(
-->별도의 이미지 서버를 구축해둔다.
->이떄 이미지 URL을 저장해둔다.이유는: 이미지를 통해 의사소통이 이루어지기 때문에 이미지 서버를 분산시켜야 한다.(아마 memchached사용)
->확장성 있는 시스템을 설계하기 위해 명확한 인터페이스를 기반으로했다.
-->이미지 메타데이터를 칼럼에 저장하기 위해서 Char, VARCHAR 의 선택시 고려한것은, 1. 가변길이인가? 2. 칼럼의 값이 자주변경되는가?




<8월23일 할 것>

1. 현재 친구 추가를 했음.Friend_ListViewActivity에서 친구추가 후 친구추가를 실시간으로 갱신해주는 것이 필요함


<8월26일>

1. 서버로 부터 받아온 친구들의 이름, 사진은, 유저의 임베디드 SQL에 저장시킨다.(이때 DBHandler가 이 모든 것을 컨트롤한다.)
-->사진 이미지는 메모리 캐쉬를 이용하지않고(너무 용량이작다.)대신 디스크 캐쉬를 사용한다
-->단, 메모리캐쉬 작업은 UI스레드 상에서 체크될 수 있지만, 디스크 캐쉬를 체크하는 작업은 백그라운드 스레드 상에서 이루어져야 합니다.
디스크 작업은 절대 UI스레드 상에서 이루어져서는 안된다. 이미지 프로세싱 작업이 모두 완료되면, 비트맵은 앞으로를 위해 메모리/ 디스크 캐쉬
양쪽에 저장시킨다.




<8월30일>
1. RabbitMQ메시징 프로토콜 사용시 생산자-소비자 모델을 구현하기 위해 BlockingQueue를 사용


<8월31일>
1. 채팅세션을 유지하기 위해 로그인시 서버로부터 세션정보를 가져오는데 이를 클라이언트 측에서 SharedPreferneces로 관리한다.(retrofit사용)



<9월1일>
1. 캐시서버를 두어 서버의 부하를 줄이려고 한다. 이떄 나의 애플리케이션에서 캐시적중율을 높일방법은?
-->친구리스트를 개인전용 캐시로 만든다.


<9월2일>
오늘 할 것: Item 객체를 RabbitMQ 큐에 전송 후 서버가 수신 후 비동기로 응답하기.
1. SlideLayout을 만들어서 그쪽에서는 채팅을 하고 메인 화면에서는 구글맵을 보여줄 수 있게 만들 것이다.
2.chat_client UI쓰레드에서 http_chat의 쓰레드로 메시지를 넘길 것이다. 여기서 (서버와 비동기통신이 이루어짐)



<9월3일>
*메시지 전송을 위해 Enter를 눌렀는데 java.lang.IllegalThreadStateException: Thread already started
발생 그 이유는 엔터를 칠때마다 쓰레드 가 계속 start()되어서 그렇다.
이걸 고쳐야 한다. 근데 서버에서 아직 메시지를 받지 못하고 있다.................(미션 Completed)

1. 서버에서 받은 Message_Data를 디비서버에 저장시키고


<9월 4일>
*클라이언트 측에서 Message_Data 객체를 byte[] 변환하여 전송, 서버측에서 byte[]배열로 수신하여 username,message,date를 각각 분별할수
있게 수신해야 한다.

0. RabbitTemplate으로 수신을 못한다 ㅠㅠㅠ 객체를 받아야 하는데....................................

-->Message클래스를 상속받아서 Message_Dat를 구현해보자
1. 해야 할 것은. 수신한 데이터를 디비에 저장시키고 현재 채팅방에 접속한 유저에게 push해야 한다.(그럴필요없다. 이미 큐에 메시지가 가있고)
해당 유저는 큐에서 메시지를 수신한다.그럴려면 그 채팅방을 나타낼 수 있또록 큐의 이름을 설정하는 법!!!이게 중요함


<9월5일>
aused by: java.lang.ClassCastException: [B cannot be cast to messaging.Message_Data
at messaging.Listener.onMessage(Listener.java:17)
at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:282)
at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:777)
... 10 more
WARN : org.springframework.amqp.rabbit.listener.ConditionalRejectingErrorHandler - Executio

이와 같은에러 발생........................



<9월6일>
* 드뎌 서버 측에서 RabbitMQ를 통해 Message_Data의 객체를 수신 받았다.
1. 그럼 이제 서버 측에 메시지를 저장하는 것
-->클라이언트에서 유저아이디,메시지내용, 시간 데이터,(아무래도 RoomID를 포함하고 있어야 한다.)를 전송하면 서버에서는

2. 그 후 채팅방이 지금은 한개인 상황으로 처리했기 때문에 Channel이 한개, exchange가 한 개 큐가 여러개인 상황이다. 만약 채팅방이 여러개가 된다면
exchange의 갯수를 조정해야 할 것인가? 채널의 갯수를 조정해야 하는가? 또한 exchange와 큐를 1:1로 매핑하는 상황을 만들어야 할 것인가?
이 부분을 처리해보자

--->RabbitMQ exchange, queue, 등의 디자인 패턴에 대해 고려해보자

<9월7일>
* 채팅 방 1개당 Exchange를 만들고 LRU알고리즘을 이용하여 자주 쓰는 채팅방을 관리한다.???
* 그리고 한명의 친구 당 한 개의 queue를 만든다.
-->각 채팅방 한개 당 Exchange를 만들고 또한 유저 당 queue를 만든다.
그리고 그 채팅방에 참여한 유저가 있으면 그 Exchange와 queue를 바인딩한다. 이떄 바인딩의 Routing key는 유저 아이디로???
-->Direct Exchange를 이용 또는 topic Exchange를 이용????

1. Exchange Routing을 사용하면 클라이언트 측에서 큐를 선언하는대신 RoutingKey를 만든다. 더 확인해 봐야겠지만 서버측에서 큐를 선언하고
큐와 Exchange를 바인딩 하는 것 같다. 그렇다면 큐의 갯수는 결국 한 유저의 친구의 수와 같은데 이를 해결하기 위해서는 로그인시
그 유저의 친구의 수 만큼 큐를 서버측에서 생성해야 할 것이다.

<9월8일>
*클라이언트와 서버측(direct-exchange선언함) rabbitmq채팅 exchange를 설정하였고, 이제 서버 측에 메시지가 저장되는지 테스트해보자


<9월9일>
*현재 basicpublish에서 chat.room1이라고 라우팅키를 지정해주면 메시지가 전송되지만, *.room1 또는 chat.*이렇게하면 전송이 되지 않고 있다.
해결하자!!!!!!!!!!!!!!!!!!!!!

아 I got it queuebind에서 chat.*라고 라우팅키를 명시하는거지 basicpublish에서는 아마 정확히 명시해야 되는 것같다.(맞았다!!!!!!!!!!!)
1. exchange 2개를 놓고 메시지를 큐에 전송하는걸 하자


<9월10일>

1. 친구리스트 액티비티에서 친구를 클릭하고 채팅을 시도-> 채팅방 리스트에 채팅방이 새로 개설되어야 한다.
이떄, Long타입으로 방 넘버를 가지고 있어야 한다.
2. 채팅방이 개설될때, 채팅을 담당하는 Exchange가 새로 생성되고 이를 캐시메모리에서 보관하고 있어야 한다.
3. 이 Exchange는 채팅방에 해당되고, 이 채팅방에 참여하는 유저들의 큐와 binding되어야 한다.

결국: 채팅방에 해당되는 Exchange와 Queue를 캐시메모리에 보관해야 한다.(캐쉬에 해야할까? 폰의 메모리에 저장할까?--->고민해보자)

댓글

이 블로그의 인기 게시물

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬

(18장) WebSocekt과 STOMP를 사용하여 메시징하기