Найти Ρ‚Π΅ΠΌΡƒ
2015 подписчиков

πŸ‘£ Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΠΎΠ½ Twitter ΠΈΠ»ΠΈ управляСмоС Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с Golang ΠΈ Kafka


БСйчас Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π»Π΅Π½Ρ‚Π° с содСрТимым пСрсонализируСтся Π² зависимости ΠΎΡ‚ интСрСсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

НапримСр, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π² поискС YouTube, ΠΈ Π·Π° ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ врСмСнна́я шкала заполнится Π²ΠΈΠ΄Π΅ΠΎ, Ρ€Π΅Π»Π΅Π²Π°Π½Ρ‚Π½Ρ‹ΠΌΠΈ Π²Π°ΡˆΠ΅ΠΌΡƒ запросу. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ β€” ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ Twitter с врСмСнно́й шкалой для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· взаимодСйствия с Ρ‚Π²ΠΈΡ‚Π°ΠΌΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ прСдпочтСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΈΠΌ Π΅Ρ‰Π΅ большС Ρ‚Π²ΠΈΡ‚ΠΎΠ².

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ простого Twitter
Π‘Π½Π°Ρ‡Π°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ простой Twitter, Ρ‚Π²ΠΈΡ‚Ρ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π½Π΅ Π² Π‘Π” постоянного хранСния, Π° Π² экзСмплярС Redis:

type Redis[T models.Keyer] struct {
rdb *redis.Client
}

func NewRedis[T models.Keyer](rdb *redis.Client) Redis[T] {
r := Redis[T]{rdb: rdb}
return r
}

func (r Redis[T]) Save(ctx context.Context, k T) error {
b, _ := json.Marshal(k)
return r.rdb.Set(ctx, k.Key(), b, 0).Err()
}
func (r Redis[T]) Get(ctx context.Context, key string) (T, error) {
var t T
b, err := r.rdb.Get(ctx, key).Bytes()
if err != nil {
return t, err
}
json.Unmarshal(b, &t)
return t, nil
}
Для облСгчСния сСриализации ΠΌΡ‹ создали ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΡƒ Redis, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π΄ΠΆΠ΅Π½Π΅Ρ€ΠΈΠΊΠΈ Golang, ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π½ΠΎΠ²Ρ‹ΠΉ интСрфСйс Keyer:

type Keyer interface {
Key() string
}
type Tweet struct {
UID string `json:"UID"`
Author string `json:"author"`
Tweet string `json:"tweet"`
}

func (t Tweet) Key() string {
return "tweet:" + t.UID
}

ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΡ ΠΎΠ±Ρ‹ΠΊΠ½ΠΎΠ²Π΅Π½Π½Ρ‹ΠΉ HTTP-ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ‚ΠΎΡ€, запускаСм ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΡƒΡŽ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ Twitter:

func main() {

rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})

tweetService := services.NewSaveTweet(repositories.NewRedis[models.Tweet](rdb))

e := echo.New()
e.POST("/tweet", func(c echo.Context) error {
content := c.Request().PostFormValue("tweet")
author := c.Request().PostFormValue("author")
tweet := models.Tweet{Tweet: content, Author: author}
tweet, err := tweetService.Save(c.Request().Context(), tweet)
if err != nil {
return c.String(500, err.Error())
}
return c.String(201, tweet.UID)
})

e.GET("/tweet/:uid", func(c echo.Context) error {
uid := c.Param("uid")
tweet, err := tweetService.Get(c.Request().Context(), uid)
if errors.Is(err, redis.Nil) {
return c.String(404, "tweet not found")
} else if err != nil {
return c.String(500, err.Error())
}
return c.String(200, tweet.Author+" : "+tweet.Tweet)

})
e.Logger.Fatal(e.Start(":1323"))
}


πŸ‘£ Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΠΎΠ½ Twitter ΠΈΠ»ΠΈ управляСмоС Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с Golang ΠΈ Kafka  БСйчас Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π»Π΅Π½Ρ‚Π° с содСрТимым пСрсонализируСтся Π² зависимости ΠΎΡ‚ интСрСсов ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
1 ΠΌΠΈΠ½ΡƒΡ‚Π°