Как разработчики, мы часто сталкиваемся с необходимостью отслеживания просмотров контента на различных платформах. Будь то отслеживание просмотров для статей, видео или продуктов, большинство приложений полагаются на простую колонку view_count
в своих таблицах базы данных. Проблема возникает, когда вы не хотите писать отдельное API для каждой таблицы, которая нуждается в подсчете просмотров, и при этом важно обеспечить безопасность от таких атак, как DoS (Denial of Service). Это та проблема, с которой я столкнулся, и причина, по которой я создал библиотеку Viewscount.
В большинстве приложений просмотры отслеживаются в той или иной форме — будь то для блога, страницы продукта или профиля пользователя. Однако создание решения, которое было бы масштабируемым и безопасным, может быть сложной задачей. Вы можете выбрать путь написания индивидуальных API для каждой из этих таблиц, но это отнимает много времени и не масштабируется. А что если можно отслеживать просмотры, не пиша API для каждой новой таблицы? Что если существует более эффективный способ интеграции этой функциональности в любое приложение? Именно в этот момент я начал работать над созданием Viewscount.
Необходимость единого решения
Когда вы строите систему с отслеживанием просмотров, одним из важных факторов является сохранение достоверности данных. В некоторых случаях злоумышленники могут попытаться искусственно увеличить счетчик просмотров, делая повторные запросы — здесь важно предотвратить такие атаки, как DoS (Denial of Service). Без надежного решения ваше приложение становится уязвимым для подобных атак, что подрывает достоверность данных.
Так появилась идея создания библиотеки Viewscount. Я хотел создать решение, которое позволило бы легко отслеживать органические просмотры для любых таблиц, независимо от фреймворка, и при этом предоставить возможность простого интегрирования этого решения в любое приложение, защищая от ненадежных инкрементов. Эта библиотека разработана для того, чтобы интегрироваться с любым Golang фреймворком, таким как Gin, Chi или даже базовым net/http, и быть независимой от базы данных, поддерживая PostgreSQL.
Как работает Viewscount
Когда вы добавляете Viewscount в свое приложение, вы можете начать отслеживать просмотры сразу — без необходимости писать отдельные API для каждой таблицы. Допустим, у вас есть таблицы, такие как tbl_driver
или tbl_vehicle
, каждая из которых имеет колонку view_count
. Вместо того чтобы создавать API специально для инкрементации счетчика просмотров каждый раз, когда пользователь просматривает страницу, вы можете использовать Viewscount для автоматического отслеживания этого процесса.
Вот как это работает на практике:
В вашей базе данных просто добавьте колонку view_count
в ваши таблицы:
CREATE TABLE tbl_driver
(
id SERIAL PRIMARY KEY,
first_name VARCHAR(100) NOT NULL DEFAULT '',
view_count INT NOT NULL DEFAULT 0,
deleted INT NOT NULL DEFAULT 0
);
Аналогично можно сделать и для других таблиц. Не нужно писать сложные запросы или API — просто добавьте эту колонку для отслеживания просмотров.
Интеграция Viewscount в ваше приложение
Самая лучшая часть библиотеки Viewscount заключается в том, что она является независимой от фреймворков. Независимо от того, используете ли вы Gin, Chi или даже net/http, вы можете легко интегрировать ее в ваше приложение. Вот как вы можете добавить ее как middleware в Gin:
Сначала нужно инициализировать view tracker в вашем приложении:
package middlewares
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/mikebionic/viewscount"
"time"
)
var viewTracker *viewscount.ViewTracker
func InitializeViewTracker(db interface{}, minutesGap time.Duration) {
viewTracker = viewscount.NewViewTracker(db, minutesGap)
}
func ViewCounterMiddleware(tableName string) gin.HandlerFunc {
return func(c *gin.Context) {
id := c.Param("id")
if id == "" {
c.Next()
return
}
idInt := 0
fmt.Sscanf(id, "%d", &idInt)
if err := viewTracker.HandleView(c.Request, tableName, idInt); err != nil {
fmt.Printf("Ошибка отслеживания просмотра: %v\n", err)
}
c.Next()
}
}
Как только middleware настроено, вы можете добавить его к вашим маршрутам. Вот как это делается:
func main() {
// Инициализация базы данных и middleware
middlewares.InitializeViewTracker(database.DB, 10)
// Определение маршрутов
router.GET("/:id", middlewares.ViewCounterMiddleware("tbl_driver"), services.GetDriver)
//...
}
Эта простая настройка интегрирует библиотеку Viewscount в ваше приложение. Middleware будет автоматически отслеживать просмотры на указанной таблице и увеличивать значение в колонке view_count
по мере необходимости, при этом обеспечивая защиту от атак.
Преимущества Viewscount
- Легкая интеграция: Всего несколько строк кода — и вы уже отслеживаете просмотры на любой из ваших таблиц.
- Независимость от фреймворков: Библиотека разработана для работы с любым Golang фреймворком, что позволяет использовать ее в проекте независимо от стека.
- Защита от атак DoS: Ограничивая быстрые запросы, которые могут искусственно увеличить счетчик просмотров, Viewscount гарантирует, что данные остаются достоверными и точными.
- Эффективность и масштабируемость: Не нужно создавать кастомные API или сложные запросы — используйте библиотеку и отслеживайте просмотры в реальном времени.
Заключение
Viewscount решает общую проблему разработки: как отслеживать просмотры на различных таблицах, обеспечивая безопасность и эффективность, при этом не писать отдельные API для каждой новой таблицы. Легкость интеграции, защита от атак и независимость от фреймворков делают ее мощным инструментом для разработчиков, создающих современные Golang-приложения.
Не стесняйтесь внести вклад в проект и сообщать о проблемах или предложениях через GitHub Viewscount. Я буду рад увидеть, как эта библиотека поможет другим в их разработке!
Счастливого кодинга!
Top comments (0)