Cách tốt hơn so với phương pháp bỏ phiếu truyền thống


10

Tôi hiện đang ở trong môi trường AngularJS / Javascript.

Hiện tại ứng dụng sử dụng phương thức bỏ phiếu (nghĩa là để lấy dữ liệu mới từ máy chủ trong một khoảng thời gian cố định).

Điều này là khá thuế và không lấy kết quả mới nhất ngay lập tức. Giả sử máy chủ đang sử dụng ASMX cho các chức năng dịch vụ web và nếu có thể, nếu không có một cuộc đại tu lớn, làm thế nào tôi có thể cải thiện tốt hơn về hiệu quả của ứng dụng?

Chỉnh sửa 1:

Bằng cách đánh thuế, ý tôi là máy chủ sẽ phải lấy các bảng SQL khác nhau và các dữ liệu và công cụ liên quan, nghĩa là xử lý dữ liệu phức tạp mà nếu có nhiều người dùng đồng thời tôi sợ có thể có vấn đề với hiệu suất máy chủ trong tương lai.

Dữ liệu mới nhất sẽ không được truy xuất vì hiện tại ứng dụng đang sử dụng loại cuộc gọi https yêu cầu phản hồi.

Tôi có thể cải thiện nhiều hơn về phía ứng dụng di động, nhưng không thể sửa đổi nhiều ở phía máy chủ ngoài các tệp dịch vụ web của máy chủ.

Câu trả lời:


10

Nếu theo "truyền thống", bạn có nghĩa là mọi khách hàng đều đập máy chủ thường xuyên nhất có thể thì tôi có thể giúp ở cấp độ kiến ​​trúc.

Thiết kế phù hợp tùy thuộc vào nơi máy chủ của bạn rơi vào lưới này:

Control \ Resources : Sufficient | Insufficient
Customizable        :     SC     |     IC
Untouchable         :     SU     |     IU
  • SC: Làm cho máy chủ theo mô hình quan sát viên . Cho phép khách hàng đăng ký làm quan sát viên.

  • IC: Chỉ cho phép một hệ thống proxy đăng ký với máy chủ. Khách hàng đăng ký với proxy.

  • SU: Chỉ cho phép một hệ thống proxy để thăm dò máy chủ. Khách hàng đăng ký với proxy.

  • IU: Chỉ cho phép một hệ thống proxy để thăm dò máy chủ. Khách hàng đăng ký với proxy.

Một proxy theo mô hình quan sát viên có thể giải quyết cả các vấn đề tùy chỉnh và tài nguyên. Điều này hoạt động tốt trên internet cũng như giữa các đối tượng. Khi bạn đăng ký, bạn yêu cầu được gọi khi có điều gì đó xảy ra. Nghe trên một cổng và bạn đã sẵn sàng để được gọi. ajax, REST, UDP, bất cứ điều gì.

Vấn đề với việc bỏ phiếu là người quan sát kiểm soát khi cuộc gọi xảy ra nhưng không biết khi nào trạng thái thay đổi nên nó thực hiện nhiều cuộc gọi không cần thiết. Điều này ăn tài nguyên đặc biệt là khi có nhiều người quan sát. Chìa khóa để đối phó với việc bỏ phiếu là: càng sớm càng tốt, hãy chuyển hướng các cuộc gọi đi từ điểm thay đổi trạng thái sang người quan sát. Sau đó, các cuộc gọi xảy ra khi họ cần. Không phải khi họ không.

Nếu bạn có cuộc gọi bỏ phiếu theo cách này:

  • Máy chủ <=== Nhiều người quan sát

Bất kỳ trong số này sẽ là một cách tốt hơn để phát hiện các thay đổi:

  • SC: Máy chủ ===> Nhiều người quan sát

  • IC: Máy chủ ===> Một proxy ===> Nhiều người quan sát

  • SU: Máy chủ <=== Một proxy ===> Nhiều người quan sát

  • IU: Máy chủ <=== Một proxy ===> Nhiều người quan sát


7
Bạn đã bỏ lỡ kịch bản "sửa chữa lười biếng": chỉ cần đưa ra một proxy nhẹ giữa các bên và tiếp tục bỏ phiếu ở mọi nơi. Vấn đề hiệu năng chính có thể đến từ máy chủ thực hiện nhiều công việc phức tạp theo từng truy vấn. Bằng cách sử dụng proxy điều chỉnh tốc độ (nginx, memcached, cấu trúc LRU trong bộ nhớ, bất cứ điều gì) đều có thể đạt được tốc độ phản hồi tốt hơn mà không cần gọi các tính toán phía máy chủ cho mỗi truy vấn Javascript.
dùng1643723

@CandiedOrange, về mặt quan sát viên, nó sẽ giống như SignalR?
Gene

@Gene nếu sự cường điệu của họ có thể được tin thì có. Họ đang nói về việc làm điều tương tự.
candied_orange

6

Bạn có thể sử dụng Server-Sent-Events để thay thế cho việc bỏ phiếu.

Thay vì yêu cầu máy chủ của bạn cung cấp dữ liệu mới mỗi n giây, hãy mở một kết nối chuyên dụng và yêu cầu nó gửi dữ liệu mới của bạn khi có sẵn!

Kết nối sẽ vẫn mở cho đến khi được đóng rõ ràng bởi máy khách hoặc máy chủ (hoặc do sự chấm dứt đột ngột của chúng).

Bạn có thể thiết lập máy chủ của mình để phát dữ liệu đến máy khách theo các khoảng thời gian cố định hoặc vào những thời điểm cụ thể tại máy chủ của bạn (cho biết khi nào một đối tượng thay đổi trạng thái hoặc khi bộ lập lịch thực hiện công việc hoặc khi nào).

Bạn có thể xác định các loại sự kiện khác nhau và có các thói quen khác nhau xử lý các loại sự kiện khác nhau.

Về phía máy chủ, bạn có thể giữ một hàng người dùng hiện đang đăng ký loại ứng dụng / sự kiện của bạn, khi một sự kiện được tạo, máy chủ của bạn sẽ phát nó cho tất cả người dùng trong hàng đợi. Các khung như Jersey2 đã triển khai phương pháp này bằng cách sử dụng đối tượng Broadcaster .

Về phía khách hàng, bạn sẽ phải viết một dịch vụ sẽ lắng nghe các sự kiện được gửi từ máy chủ trên một url cụ thể .

Khi bạn nhập trạng thái / tuyến đường, bạn sẽ phải đăng ký loại máy chủ và hủy đăng ký $destroyđể tránh rò rỉ.


Xin chào svarog, chúng tôi có thể đạt được phát đa hướng bằng cách sử dụng các sự kiện được gửi từ máy chủ không?
kapil das

3

Chúng là websockets: chúng là một ví dụ của HTTP, hoạt động trong cùng một cổng.

Nó cho phép giao tiếp hai chiều giữa máy khách và máy chủ và tất nhiên là có tích hợp angularjs cho điều đó.

Mặt khác, ở phía sau văn phòng, nếu bạn nhìn vào Spring trong Java, có nhiều cách khác để làm điều đó:

  • Bỏ phiếu dài
  • STOMP
  • ...

Liên kết này covevr websocket và các phương thức khác phù hợp với những gì bạn cần.

Lưu ý rằng nếu bạn không có Spring / Java, bạn vẫn nên đọc nó và tìm kiếm giải pháp tương đương trong kho công nghệ của mình.


Số lượng kết nối ổ cắm mở tối đa mà máy chủ có thể xử lý đồng thời là bao nhiêu? Là websockets có thể mở rộng?
thewebjackal

Điều đó tôi không biết, rất có khả năng một số thứ có thể tải cân bằng nhưng tôi không biết điều đó.
Walfrat

1

Bạn cần xác định rõ hơn những thứ như "đánh thuế khá" và khám phá lý do tại sao nó không lấy kết quả mới nhất ngay lập tức. Đây là những câu hỏi có thể xảy ra bất kể bạn có bỏ phiếu từ khách hàng của mình hay không.

Điều đó nói rằng, với giao diện người dùng dựa trên trình duyệt, về cơ bản, bạn có hai tùy chọn nếu bạn muốn ở lại javascript gốc: bỏ phiếu (như bạn đang làm, hoặc có thể bỏ phiếu dài) hoặc ổ cắm web. Tôi chưa từng thấy các socket web được thực hiện w / ASMX trước đây (không nói rằng nó không thể được thực hiện, chỉ là tôi không có kinh nghiệm ở đó nên tôi không biết bạn sẽ khó thực hiện như thế nào). Hơn nữa, nếu bạn gặp vấn đề về hiệu suất hoặc độ chính xác, như tôi đã nói, những vấn đề đó vẫn có thể tồn tại ngay cả khi sử dụng ổ cắm web.


xin vui lòng xem cập nhật!
Gene
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.