Micro-service of online image microblogs
- cassandra.so
- libuv.so
- all deb-packages fastcgi-daemon Собирать через make
img2web REST API:
REQUEST
- URL: /feed
- METHOD: GET
- PARAMS: page_number, login
- Примечание: page_number - некое число 0 .... N - пользователю будут показаны изображения в промежутке: (page_number * 10, page_number * 10 + 10) // 10 изображений на страницу
- Content-Type: application/json
- Code: Success - 200 OK
- Body if success: {[{"login" : login1, image_binary_format" : image_binary_format1}, {"login" : login2, image_binary_format" : image_binary_format2}... ]}
- URL: /users // возвращает логины всех, когда либо логинившихся пользователей
- METHOD: GET
- Content-Type: application/json
- Code: Success - 200
- Body if success: {[{"login": usr_login}, ... ]}
- URL: /subscribe // добавлять в ленту пользователя с логином login записи пользователя username
- METHOD: POST
- PARAMS: login, username
- Content-Type: plain/text
- Code: Success - 200 FAIL - 434 // login or username does not exist
- URL: /post
- METHOD: POST
- PARAMS: login, image_binary_format
- Content-Type: application/json
- Code: Success - 200 FAIL - 434 Incorrect login
В этой части - просто команды для создания табличек в Cassandra + небольшое описание
cqlsh> DESC TABLE img2web.
images subscriptions users
Итого у нас 3 таблички (в KEYSPACE img2web)
CREATE TABLE images (
login text,
ts timeuuid,
img text,
PRIMARY KEY ((login), ts)
) WITH CLUSTERING ORDER BY (ts DESC)
Таблица с картинками каждого пользователя, хранит информацию о логине, времени отправки, самой картинке в base64. PartitionKey - login (т.е. в случае проблем с дц устаревшими - т.е. из несинхронизированной реплики -могут оказаться записи только некоторых пользователей - это хотя бы последовательно). Clustering Order по времени отправки по убыванию, т.к. это естественным образом воспроизводит структуру ленты новостей
CREATE TABLE subscriptions (
login_from text,
login_to text,
PRIMARY KEY ((login_from), login_to)
)
CREATE INDEX followers ON subscriptions (login_to);
Собственно кто на кого подписан. По этой же табличке построен обратный индекс (чтобы быстро понимать, кто подписан на тебя)
CREATE TABLE users (
login text,
PRIMARY KEY ((login))
)
Собственно табличка со всеми пользователями нашего сервиса
Такая структура даёт нам одно суперское преимущество - изображение постится с помощью одного обращения к базе с одной командой на запись. Если умножить это на скорость записи в кассандре - получается вообще отлично. С чтением своей ленты всё чуть сложней - придётся сначала вычитать в память список тех на кого ты подписан, а затем запросом к images WHERE login in (те, на кого ты подписан) выбрать нужное. Это хоть и будет делаться параллельно - всё равно не супер.