기본 콘텐츠로 건너뛰기

Etsy서비스에서의 피드 아키텍쳐 (Etsy's Activity Feed Architecture)

Etsy(엣시) 서비스란?

  엣시는 미국의 웹2.0을 기반으로 한 전자상거래 사이트이다. 당시 목수이자 웹 디자이너이었던 엣시의 창업자 로버트 칼린은 대표적 전자상거래 사이트인 이베이가 아닌 좀 더 특별한 웹 사이트에 그가 만든 목공예품을 등록하길 원했으며, 2005년 6월 18일에 소셜 네트워크 쇼핑몰 엣시를 구축 했다. 현재 엣시에는 핸드메이드 물건과 사진, 그림, 빈티지 제품 등을 판매 할 수 있고 약 150여개 국가에서 240만명의 유저들이 엣시를 이용하고 있다. 위키백과

Activity Feed Architecture

1. 주요 요소

  1) Connections : 유저와 샵, 유저와 유저와의 관계 (node, edge, weight를 가지고 있음)
  2) Activities : (Subject, verb, object)로 구성됨. ex) 찰스가 A물품에 좋아하기를 눌렀다.

2. 피드 생성 단계

  1) Aggregation : Connection을 기반으로 Activities를 모아 유저별로 newsfeed를 구성
  2) Display : newsfeed를 화면에 노출

3. Aggregation

  1) affinity 기반으로 connection을 선출함. (다만 random도 어느정도 반영하여 affinity가 떨어지는 connection도 newsfeed 구성에 일부 활용)
  2) 대부분의 유저들은 connection이 잘 구성되지 않는 경우가 많은데, 12개 정도의 connection을 임의로 선출하여 사용함.
  3) 이후 Activity Set들을 구성 (메모리 자료구조 활용함), 이것들을 분류하고 중복은 제거하고 score (time decay function)를 생성하여, sort&merge함. 이것을 기존에 있던 newsfeed 중간중간에 껴넣는 작업을 진행, 그리고 해당 newsfeed가 일정 길이 이상 길어지면 제거하는 작업도 함께 진행함. 최종적으로 구성된 newsfeed를 memcached에 저장함.
  4) Aggregation은 다음 단계에서 수행. (peak시에 25배 정도 늘어남)
    - 유저가 뭔가를 마쳤을때, 예를들면 로그인 완료.
    - cron잡이 돌때 (스케쥴링)
    - 유저의 connections들이 뭔가를 할때. (트래픽이 겁나 늘어나는 지점)

4. Display

  1) memcached에 저장된 news를 화면에 뿌려줌
  2) 그냥 naive하게 보여주면 너무 장황해 보이고, 따라서 roll up해주는 과정을 거침.
  3) 그리고 해당 rollup된 묶음에 스토리를 부여해줌.

5. 성능 향상

  1) 캐시 웜업 작업
  2) TTL 캐싱 적용
  3) 화면에 보여지는 형태(template)로 ORM을 구성하여 사용함.
  4) 화면상에 lazy loading 적용

참고 링크

- 웹사이트 : https://www.etsy.com/
- 설명자료 : http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture/


댓글

이 블로그의 인기 게시물

[JAVA] pass-by-value & pass-by-reference

pass-by-value? or pass-by-reference? in JAVA JAVA 개발을 8년째 해오고 있지만, 아직도 기본이 부족하다고 느낄때가 참 많습니다. 최근에는 대학교 1학년 학부 생활할때쯤 배웠던  'pass-by-value (call-by-value)' / 'pass-by-reference (call-by-reference)'에 대해서 다시 한번 개념을 정리한 계기가 있었습니다. 먼저 퀴즈를 통해 접근해 보도록 하죠. 퀴즈) 다음과 같은 코드에서 출력되는 count값은? @Test public void passByValueTest () { Integer count = 1 ; increment( count ) ; System. out .println( "* count : " + count ) ; } private void increment (Integer count) { count++ ; ++count ; } 아마도 대부분의 사람들이 "3"이라고 대답하지 않을까 싶습니다. 또는 증가 연산자인 '++' 의 위치에 대해서 뭔가 함정이 있을까 고민할수도 있겠네요. 누군가는 당연하다고 여길지 모르겠으나 정답은 " 1 " 입니다.   즉, count값은 변경되지 않습니다.  (정확하게 얘기하면 passByValueTest() 메소드안의 count값이 변경되지 않습니다.) JAVA만 공부하셨던 분들은 당연하게 받아들이시는 분들도 있으실테지만, C나 여타 다른 언어를 함께 공부하셨던 분들은 약간 혼란스러운 부분이 있을수 있을것 같습니다. (JAVA에서 object를 넘기면 pass-by-reference 아닌가?? JAVA에선 reference를 어떻게 넘기지?) JAVA엔 포인터를 안쪽에 숨기고 있기 때문에 이런 혼란스러움이 생기는것 같은데요, JAVA는 오직 p...
HATEOAS(Hypermedia As The Engine of Application State) HATEOAS란? - REST application 의 규약 - 클라이언트는 선행정보 없이 서버로부터 전송되는 데이터만으로도 인터렉션이 가능해 진다. 기정의된 IDL 인터페이스를 통해 SOA(Service Oriented Architecture)와 대조되는 개념이다. - client는 어떤 document나 다른 정보 없이 서비스의 하위 정보로 접근이 가능해 지는 이점을 가져갈 수 있다. 기존에 hypertext에서 href를 통해 링크 정보를 내려주는 것과 비슷하다고 볼 수 있다. Hypermedia는 뭐지? - Hypertext의 확정향 개념, hypertext는 일반 text에서 문서간 이동이 가능하도록 hyperlink를 제공해 주었는데, 여기에 Hypermedia는 audio, video까지 포함한 개념으로 이해하면 된다. - 참조 :  https://en.wikipedia.org/wiki/Hypermedia Examples { " content " : [ { " price " : 499.00 , " description " : " Apple tablet device " , " name " : " iPad " , " links " : [ { " rel " : " self " , " href " : " http://localhost:8080/product/1 " } ], " attributes " : { " connector " : " ...