Как кэшировать дорогие запросы в базу данных с помощью бессерверного кэша Momento

Когда использовать кэш

Когда вы создаете веб-приложение, вам нужно будет получить данные из базы данных. По мере роста трафика и размера базы данных вы увидите, что запросы в базу данных становятся все медленнее.

Чтобы быстро возвращать запросы пользователям, кэш может быть экономически эффективным и простым решением вместо обновления базы данных.

Screen-Shot-2022-12-22-at-10.37.53-AM
Диаграмма, показывающая, как работает кэш

Кэш – это база данных в памяти, которая может хранить простые данные как структуру данных ключа и значения.

Популярные решения для кэширования с уже существующим открытым кодом это Memcache и Redis.

Что такое Momento?

Momento Serverless Cache – это Caching-as-a-Service (CaaS), который можно интегрировать как решения для кэширования. Это уменьшит дорогостоящие или ненужные запросы в вашу основную базу данных.

Screen-Shot-2022-12-22-at-12.54.33-PM

Momento имеет SDK для восьми самых популярных языков программирования. Вот пример использования Ruby SDK для простого получения и установки элемента кэша:

require 'momento'

client = Momento::SimpleCacheClient.new(
  auth_token: ENV['MOMENTO_AUTH_TOKEN'],
  default_ttl: ENV['MOMENTO_TTL']
)

response = client.set ENV['MOMENTO_CACHE_NAME'], "Hello", "World"
response = client.get ENV['MOMENTO_CACHE_NAME'], key
if response.hit?
  puts "Cache returned: #{response.value_string}"
elsif response.miss?
  puts "The item wasn't found in the cache."
end

Краткое замечание: компания называется Momento, а продукт кэширования — Momento Serverless Cache, но мы просто говорим «Momento», чтобы сослаться на продукт, чтобы сделать его простым.

Зачем использовать Momento?

Momento — бессерверный кэш, который имеет следующие преимущества:

  • Создание нового кэша происходит практически мгновенно
  • Вы платите в зависимости от использования (0,15 долл. США/ГБ за стоимость передачи)
  • У него очень щедрый бесплатный уровень (первые 50 ГБ в месяц бесплатно)
  • Чтобы начать использовать кэш, кредитная карта не требуется
  • Он просто масштабируется, не требует конфигурации или настройки сервера
  • Он просто работает из любого места

Momento идеально подходит для разработчиков, которым просто нужно простое решение для кэширования, и они хотят сосредоточиться на своем коде вместо того, чтобы управлять инфраструктурой кэширования.

Почему бы не использовать пользовательскую службу с открытым кодом?

Они уже управляемые облачными службами с открытым кодом.

К примеру:

  • AWS имеет ElasticCache, который позволяет запускать Memcached или Redis
  • Amazon MemoryDB для Redis
  • Azure имеет кэш Azure для Redis
  • Redis имеет собственное предложение Redis Cloud

Эти существующие облачные службы могут упростить некоторые аспекты размещения и масштабирования уровня кэширования для веб-приложений. Но есть некоторые вещи, которые следует учитывать:

  • Вы должны выбрать вычисление правильного размера
  • есть дополнительные этапы интеграции программы
  • для создания кэша требуется время (до часа).
  • существуют ограничения относительно того, где в вашей сети должен располагаться кэш

База данных Redis с открытым кодом в памяти, например, имеет различные сложные структуры данных и операции с данными. Она может быть пригодна для более продвинутых случаев использования, где она выходит за рамки кэш-памяти и может действовать (и продается как) основная база данных.

Нет неверного ответа при выборе тайника. У вас есть компромиссы, и вам нужно выбрать наилучшее решение для вашего случая использования.

Как установить Momento CLI

Momento (на момент написания этой статьи) – это служба только по API.

Чтобы использовать Momento, необходимо создать учетную запись с помощью их инструмента CLI.

Инструкции по установке Windows:

brew tap momentohq/tap
brew install momento-cli

Инструкции по установке Linux:

wget 
tar -xvf momento-cli-0.22.8.linux_x86_64.tar.gz --strip-components 3
sudo mv momento /usr/local/bin
rm momento-cli-0.22.8.linux_x86_64.tar.gz

После установки проверьте, работает ли CLI с помощью такой команды:

momento --version
> momento 0.22.6

Как создать аккаунт Momento

Чтобы создать аккаунт, введите следующую команду:

momento account signup aws \
--email YOUR_EMAIL \
--region us-east-1

> Signing up for Momento...
> Success! Your access token will be emailed to you shortly.

Не забудьте заменить YOUR_EMAIL с вашим электронным адресом (например, andrew@example.com).

Моменто есть собирается отправить маркер доступа по электронной почте и этот маркер доступа – это то, как Momento будет идентифицировать и авторизовать наши будущие вызовы API для использования кэша.

Screen-Shot-2022-12-21-at-9.55.07-PM
Пример электронного письма с предоставленным маркером

Почему мне понадобилось вводить «aws» при создании аккаунта?

Обратите внимание, что мы указали aws и регион AWS нас-восток-1 на создание.

При создании учетной записи необходимо указать, у какого поставщика облачных услуг (CSP) будет размещен кэш.

Можете ли вы подумать, нужно ли мне иметь и подключать собственную учетную запись AWS?

Ответ – нет. Кэш настраивается в аккаунте Momento AWS.

Причина, почему Momento позволяет выбрать CSP, заключается в том, что некоторые компании имеют политику в отношении данных о том, в какой части мира и в каком CSP должны храниться их данные.

Как настроить CLI для использования маркера доступа

Нам необходимо настроить CLI для использования маркера доступа, отправленного по электронной почте.

Введите momento configure команда для вызова мастера настройки:

momento configure
Token: XXXXXXXXXXXXXXXXX
Default Cache [default-cache]: 
Default Ttl Seconds [600]: 
default-cache successfully created as the default with default TTL of 600s
  • Токен: введите маркер, скопировав и вставив его из предыдущего электронного письма
  • Кэш по умолчанию: Нажмите кнопку enter
  • Типичный TTL: Нажмите Enter

The momento configure создаст два файла конфигурации TOML:

  1. ~/.momento/credentials – сохраняет конфиденциальную конфигурацию, например: маркер доступа
[default]
token=XXXXXXXX

2. ~/.momento/config – сохраняет общую конфигурацию, например: ttl default

[default]
cache=default-cache
ttl=600

Как установить и получить данные кэша

Настроить данные кэша очень просто. Вы имеете cache set и cache get подкоманды:

momento cache set --key "andrew" --value "brown" 
momento cache get --key "andrew"
> brown

Как создать новый кэш

Мы можем мгновенно создать другой кэш с помощью cache create команда. И мы обеспечим --name флаг к cache get и cache set:

momento cache create --name freecodecamp
momento cache set --name freecodecamp --key "Quincy" --value "Larson" 
momento cache get --name freecodecamp --key "Quincy" 
> Larson

Как интегрировать Momento непосредственно в код веб-приложения

Чтобы использовать Momento в коде серверной веб-приложения, нам нужно использовать одну из предоставленных SDK.

Давайте напишем пример использования Momento в веб-программе Flask (Python) с помощью Momento Python SDK.

Вот как выглядит наша программа Flask без использования кэширования:

import os
import psycopg2
from flask import Flask, render_template
import json

app = Flask(__name__)

def get_db_connection():
    conn = psycopg2.connect(host="localhost",
                            database="flask_db",
                            user=os.environ['DB_USERNAME'],
                            password=os.environ['DB_PASSWORD'])
    return conn

@app.route('/')

def index():
    json_data = get_free_courses()

    response = app.response_class(
        response=json_data,
        status=200,
        mimetype="application/json"
    )
    return response

def get_free_courses():
  json_data = None
  conn = get_db_connection()
  cur = conn.cursor()

  cur.execute('SELECT * FROM free_courses;')
  free_courses = cur.fetchall()

  json_data = json.dumps(free_courses)

  cur.close()
  conn.close()
  return json_data

Вот как будет выглядеть наше приложение с внедрением Momento:

import os
import psycopg2
from flask import Flask, render_template
import json
from momento import simple_cache_client as scc

_MOMENTO_AUTH_TOKEN  = os.getenv('MOMENTO_AUTH_TOKEN')
_MOMENTO_TTL_SECONDS = os.getenv('MOMENTO_TTL_SECONDS')
_MOMENTO_CACHE_NAME  = os.getenv('_MOMENTO_CACHE_NAME')

app = Flask(__name__)

def get_db_connection():
    conn = psycopg2.connect(host="localhost",
                            database="flask_db",
                            user=os.environ['DB_USERNAME'],
                            password=os.environ['DB_PASSWORD'])
    return conn

@app.route('/')
def index():
  with scc.SimpleCacheClient(_MOMENTO_AUTH_TOKEN, _MOMENTO_TTL_SECONDS) as cache_client:
    key = 'get_free_courses'
    get_resp = cache_client.get(_CACHE_NAME, 'get_free_courses')
    if get_resp.status() == 'hit':
      json_data = get_resp.value()
    elif get_resp.status() == 'miss':
      json_data = get_free_courses()
      cache_client.set(_CACHE_NAME, 'get_free_courses', json_data)

    response = app.response_class(
        response=json_data,
        status=200,
        mimetype="application/json"
    )
    return response

def get_free_courses():
  json_data = None
  conn = get_db_connection()
  cur = conn.cursor()

  cur.execute('SELECT * FROM free_courses;')
  free_courses = cur.fetchall()

  json_data = json.dumps(free_courses)

  cur.close()
  conn.close()
  return json_data

Резюме

Если вы хотите попробовать Momento, посетите документацию на веб-сайте, чтобы узнать больше.

Служба бессерверного кэша Momento Бессерверный кэш Momento

Узнайте, что вам нужно знать, чтобы ускорить облачную программу с помощью первого в мире бессерверного кэша.

логотип

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *