THẢO LUẬN

thg 11 18, 2020 2:23 CH

Trước tiên cảm ơn anh vì seri bổ ích này nha, mới thực hành tới bài 7, các bài còn lại chỉ đọc thôi chứ chưa bắt tay vào làm nên nhiều chỗ còn lơ mơ 😆, đọc 1 lượt rồi thực hành dần. Tới đây e có câu hỏi thế này mong anh giải đáp ạ.

  1. Ở chỗ deploy em thấy có lệnh:
docker-compose down;
docker pull ${CI_REGISTRY_IMAGE}:latest;
docker-compose up -d;

Có nghĩa là tất cả Service sẽ restart đúng k ạ. Ở trong trường hợp của em, em lưu data vào redis để làm ranking system, data lớn lắm mỗi lần khởi động lại mất 20p gì đó lận. Service của em gồm:

  • App (nodejs app)
  • Redis

Mà khi em thay đổi code thì chỉ có App là cần restart, việc khởi động lại Redis là không cần thiết. Vậy cho em hỏi có cách nào mà mình chỉ khởi động lại App không ạ? Hay nên tách Redis và App ra 2 container khác nhau? Hay còn giải pháp nào khác ạ.

  1. Câu này đáng ra k nên hỏi ở bài này. Chuyện là em cài docker trên server window, chạy win 10 pro, xong em lưu mongodb mount = volumn gì đó do docker quản lí, xong 1 hôm máy em bị treo, khi start lại thì docker ko lên nữa, nó báo lỗi như link e để dưới, em có search thấy 2 lệnh tưởng là reset lại cài đặt của docker thôi, ai ngờ nó xoá cả volumn chứa data của mongodb đi luôn (tay nhanh hơn não là có thật 😆), data redis thì vẫn còn vì em ko dùng volumn của docker quản lí.
wsl --unregister docker-desktop
wsl --unregister docker-desktop-data

Docker thì start thành công rồi nhưng Database thì 😂 Nay thì em quyết định chuyển database lên VPS ubuntu rồi, còn server windows e để chạy redis thôi. (Lí do là vì máy windows đặt ở nhà có khi mất điện, mất mạng, các data ở redis thì có down 1 lúc cũng được, mongodb thì luôn cần uptime) Em cảm ơn ạ!

0

chuẩn luôn em :v

0
thg 11 18, 2020 1:54 CH

chắc ở dự án X hay bị vả cái n+1 lắm a nhỉ, query dài thế cơ mà =))))))))

0

@huukimit với cho em hỏi cái khai báo port của traefik trong file docker-compose.yml so với entryPoints trong traefik.yml thì nó khác nhau như nào và công dụng là gì v ạ? docker-compose.yml version: '3.7' volumes: grafana-data: prometheus-data:

services:
  traefik:
    image: traefik:v2.2
    container_name: traefik
    restart: always
    security_opt:
      - no-new-privileges:true
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/traefik.yml:ro
      - ./data/acme.json:/acme.json
      - /var/log/traefik/traefik.log:/traefik.log
      - /var/log/traefik/traefikAccess.log:/traefikAccess.log
      # Add folder with dynamic configuration yml
      - ./data/configurations:/configurations
    networks:
      - web

traefik.yml

api:   
  dashboard: true

entryPoints:   
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: websecure   
  websecure:
    address: :443
    http:
      middlewares:
        - secureHeaders@file
      tls:
        certResolver: letsencrypt

providers:   
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false   
  file:
    filename: /configurations/dynamic.yml

certificatesResolvers:   
  letsencrypt:
    acme:
      email: nguyendang2411@yahoo.com
      storage: acme.json
      keyType: EC384
      httpChallenge:
        entryPoint: web

log:   
  filePath: /traefik.log   
  level: DEBUG

accessLog:   
  filePath: /traefikAccess.log

metrics:   
  prometheus:
    addEntryPointsLabels: true
    addServicesLabels: true
+1
thg 11 18, 2020 10:32 SA

Hay đấy nhỉ. tks!

0
thg 11 18, 2020 10:27 SA

Khá nhiều tip hay về partitions mà mình chưa biết. cám ơn chủ thớt.

0
thg 11 18, 2020 9:55 SA

ở thời điểm này giới thiệu thì nên giới thiệu luôn laravel 8 đi bạn 😅😅 laravel 5.8 ra đầu năm 2019, cũng tương đối cũ rồi, và mỗi lần laravel nâng cấp là kha khá thứ được thêm vào 😁😁 như insert data số lượng lớn, ví dụ của bạn chèn 1000 records vào table, laravel 8 có thêm đồ chơi upsert rất gì và này nọ nhé 😌😌 xem thêm ví dụ về đồ chơi này ở đây

+2
thg 11 18, 2020 9:37 SA

xin fb bạn ơi, có chơi bê đê không.😃))

0

bài của bạn rất bổ ích , cảm ơn bạn nhiều nha 😃)

0
thg 11 18, 2020 8:54 SA

phần useReducer : const [state, dispatch] = useReducer(reducer, initialState) cái tham số reducer là function Reducer hả ad ? function Reducer(state, action) { const [count, setCount] = useState(0); switch (action.type) { case 'INCREMENT': return setCount( count + 1); case 'DECREMENT': return setCount( count - 1); default: throw new Error(); } }

+1
thg 11 18, 2020 8:27 SA

cho mình hỏi nếu muốn kết hợp 2 kiểu chart thì phải làm sao? Cảm ơn

0
thg 11 18, 2020 8:23 SA

Sao ở bước 3 mình viết sự kiện onClick cho nút Delete và truyền toàn bộ đối tượng Item vào làm tham số. Khi click vào nút Delete thì nó lại xuất hiện lỗi TypeError: this.props.handleShowAlert is not a function

0
thg 11 18, 2020 8:13 SA

@BuiHuyHoang cảm ơn mà lại bị 2 downvote thế này (dead)

0
thg 11 18, 2020 8:10 SA

nếu thấy hữu ích thì cho mình một up vote nhé 😄

0
thg 11 18, 2020 8:08 SA

Cảm ơn bác, rất hữu ích 😃)

+1
thg 11 18, 2020 7:31 SA

Theo mình nhớ thì mình đâu có ghi Js cho phép thực hiện các operation song song nhỉ 😀

Tiện thể thì Js không cho thực hiện các operation song song nhưng Web APIs(browser) thì có b nhé 😉.

Ngoài HTML, CSS và Js ra thì không biết bạn muốn dùng ngôn ngữ nào khác nữa để sử Web APIs nhỉ 😀

Nếu b chưa biết RxJs sử dụng web APIs thông qua Js như thế nào để thực hiện các operation một cách song song thì b có thể đọc source code của thư viện nhé 🙂

0
thg 11 18, 2020 7:12 SA

Mãi yêu ❤️

+1
Avatar
đã bình luận cho bài viết
thg 11 18, 2020 6:55 SA

Hay, có nhóm Ruby chat nào active ko bạn ơi, cho mình tham gia với

0
Avatar
đã bình luận câu trả lời trong câu hỏi
thg 11 18, 2020 6:54 SA

Cảm ơn bạn, mình tự mò được rồi, share lại cho mọi người tham khảo 😄

model: user.rb

def self.find(id)
    user = Rd.user_get(id)
    if !user
      puts "OVERRIDING no user #{id}"
      user = super
      Rd.user_set(id, user, {:ex => 3600})
    end

    return user
  end

services/rd.rb

class Rd
  def self.user_get(id)
    begin
      user = $rd.get("user_info_#{id}")
      puts "user redis #{id}"
      return User.new(JSON.parse(user))
    rescue
      return nil
    end
  end


  def self.user_set(id, user, options={})
    $rd.set("user_info_#{id}", user.to_json, options)
  end
end

$rd là redis client connection chỗ application.rb

$rd = Redis.new(
        :url => "redis://#{ENV['REDIS_CONNECT']}/0",
        :connect_timeout => 0.2,
        :read_timeout    => 1.0,
        :write_timeout   => 0.5
    )
0
thg 11 18, 2020 4:01 SA

Phải upvote cho siêu nhân để kiếm thêm nhiều bài viết 😍 😍 😍

0
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí