2010-07-07 28 views
11

Tôi có một vấn đề thú vị cần giải quyết. Một trong những khách hàng của tôi đã giúp tôi phát triển một chương trình phân tích chứng khoán với gần 50 năm dữ liệu chứng khoán cho gần một nghìn ký hiệu. Tôi đã phát triển một loạt các bộ lọc được áp dụng vào bất kỳ ngày cụ thể nào để xem liệu có bất kỳ điều gì rơi vào một giao dịch hay không.Kiến trúc tốt nhất cho truy vấn 30 giờ

Chúng tôi muốn chạy bộ lọc này cho mỗi ngày dữ liệu chúng tôi có cho mỗi cổ phiếu. Về cơ bản, báo cáo loại ngày bắt đầu và kết thúc của bạn. Tuy nhiên phải mất 6 phút để lọc mỗi tuần cho mỗi biểu tượng. Chúng tôi đang tính toán khoảng 40 giờ để chạy báo cáo trên toàn bộ tập dữ liệu của chúng tôi.

Yêu cầu ghi đè là khách hàng của tôi có thể thực hiện bất kỳ thứ gì trong ứng dụng từ bất kỳ máy tính nào (anh ấy đi rất nhiều), vì vậy chúng tôi dựa trên trình duyệt.

Để giải quyết vấn đề này, tôi đã viết một phương pháp không đồng bộ chạy báo cáo này, tuy nhiên bộ đếm thời gian không hoạt động của hồ bơi ứng dụng sẽ giết công việc. Tôi không muốn phải bắt đầu điều chỉnh thời gian chờ cho toàn bộ ứng dụng để hỗ trợ báo cáo này (chúng tôi sẽ thực hiện rất nhiều điều này vì mọi scenerio cổ phiếu sẽ cần phải chạy trên toàn bộ tập dữ liệu của chúng tôi để phân tích trước khi nó được sử dụng cho hoạt động giao dịch).

Có ai có bất kỳ ý tưởng chung hoặc trải nghiệm nào với kiến ​​trúc web sẽ hỗ trợ quá trình không đồng bộ cực dài không?

Cảm ơn

Trả lời

17

Như một gợi ý chung tôi muốn giới thiệu một dịch vụ Windows độc lập, Console App hoặc tương tự với các điều khiển cuộc đời rất cẩn thận và khai thác gỗ, mà sẽ chạy liên tục và kiểm tra (thăm dò) cho 'công việc để xử lý' trong một cơ sở dữ liệu, sau đó cập nhật cơ sở dữ liệu với kết quả và thông tin tiến độ.

Nó có thể không phải là cách tốt nhất nhưng tôi đã sử dụng nó trước nhiều lần và nó đáng tin cậy, khả năng mở rộng và có hiệu suất tốt.

Cách tốt nhất để giữ yêu cầu web tối đa một hoặc hai phút - chúng không bao giờ được thiết kế cho thời gian xử lý nặng. Bằng cách này, bạn có thể 'đăng ký' trên trạng thái công việc mỗi phút hoặc lâu hơn (sử dụng Dịch vụ Web).

Nếu bạn có bất cứ thắc mắc của tôi hay về ý tưởng xin vui lòng viết bình luận & tôi sẽ được hạnh phúc để giúp đỡ, xây dựng hoặc đề nghị ..

Hy vọng rằng sẽ giúp!


(bổ sung: Tôi tin rằng Windows và dịch vụ được underused Tất cả phải mất là một lớp cơ sở nhanh chóng hoặc tập hợp các phương pháp helper tái sử dụng và bạn đã có một đăng nhập, đáng tin cậy, tự động, cấu hình, nhanh chóng-to-thực hiện! nhanh chóng để thử nghiệm với quá!)

+3

+1 cho Dịch vụ Windows. Công việc này không thuộc về khối lượng công việc của ứng dụng web. –

+1

+1 yep, đó là những dịch vụ dành cho, 100% đã đồng ý, đưa nó vào một ứng dụng web chỉ là một hack – andy

+0

Kieren, Cảm ơn bạn đã trả lời. Vâng, tôi nghĩ bạn đã chạm vào móng tay ngay trên đầu và cách tiếp cận này phù hợp với phần còn lại của kiến ​​trúc của chúng tôi. Chúng tôi đã chạy các dịch vụ Windows để quản lý tải xuống báo giá lịch sử khi thị trường đóng cửa. Ngoài ra, thời gian chờ duy nhất tôi sẽ phải quản lý là CommandTimeout của SQL đơn giản là đủ. Tôi có thể cho phép người dùng nhập thông số cho báo cáo của họ, lưu trữ chúng trong cơ sở dữ liệu và kéo chúng lên và chạy chúng trong ngữ cảnh của dịch vụ. Tôi biết rằng yêu cầu này sẽ không được giải quyết bởi một trang web. Cảm ơn bạn - Bravo! – MikeMalter

6

Có lý do nào không chỉ đơn giản là chạy một dịch vụ trong nền và lưu trữ resultsets cá nhân vào một bảng kết quả chỉ đọc khi chúng được yêu cầu? Bạn có cần chạy truy vấn trong thời gian thực không? Ứng dụng có thể truy xuất các trang kết quả khi chúng được tạo bởi dịch vụ.

+0

+1 - Tôi làm điều này lần thứ hai. Liệu một truy vấn dài này có thực sự cần phải là đặc biệt không. Chuẩn bị trước kết quả của bạn và có dịch vụ web truy xuất các giá trị được lưu trong khi dịch vụ OS cập nhật truy vấn nếu cần. –

+0

Mike và J - Tôi không muốn lưu trữ các tập bản ghi và sau đó kéo chúng lên. Tuy nhiên, phần dịch vụ là một ý tưởng rất hay. – MikeMalter

2

Nói chung, các quá trình không đồng bộ cực dài không đi trên web.

yêu cầu của ông nên được xếp hàng đợi và quá trình khác nên chạy công việc và lưu trữ dữ liệu theo định dạng người dùng sẽ sử dụng nó trong.

+0

Ed, yup. Suy nghĩ của tôi, cảm ơn những suy nghĩ của bạn. – MikeMalter

2

Sáu phút để lọc một tuần dữ liệu? Có vẻ như db của bạn cần finetuning chỉ mục thích hợp.

+2

Hãy nhớ rằng "một tuần dữ liệu" có thể có nghĩa là nhiều thứ - chỉ cần đóng mỗi ngày (năm điểm dữ liệu), hoặc mỗi lần đánh dấu (có thể thành hàng triệu điểm). –

+0

Nó cũng phụ thuộc vào phần mềm/phần cứng được sử dụng và thiết kế cơ sở dữ liệu. Trong cuộc sống chuyên nghiệp của tôi, tôi thấy cơ sở dữ liệu được xây dựng theo nhiều cách ngớ ngẩn: .. cơ sở dữ liệu với bảng chỉ đọc có hơn một tỷ hàng .. một cơ sở dữ liệu nhỏ (<5 GB) với hàng trăm bảng và hàng chục quan hệ bằng cách sử dụng các khóa chính nhiều cột/không đơn giản - nó liên tục kích hoạt. Sẽ dễ dàng hơn để xây dựng một cách tồi tệ, và xung quanh những trải nghiệm còn thiếu có nhiều thứ để đi xung quanh. "Chỉ một lần này" trở thành học thuyết của sự hối hận. – Hardryv

+0

friol, Bob nói đúng. chúng tôi đang xem xét hàng triệu điểm để có các bộ lọc, và sau đó có FFIILLTTEERRSS! Và tôi đồng ý với ý tưởng của bạn về việc điều chỉnh chỉ mục thích hợp. Mỗi thủ tục được lưu trữ có kế hoạch truy vấn của nó được phân tích và tôi chắc chắn yêu thích tính năng của SQL 2008 về việc cho bạn biết bạn có thể thiếu những chỉ mục nào. – MikeMalter

5

Có vẻ như bạn đang thực hiện truy vấn SQL trực tiếp dựa trên những dữ liệu này. Bạn đã cân nhắc tải dữ liệu hay chưa, ví dụ: Dịch vụ phân tích SQL Server và thiết lập một khối lập phương với thời gian (để bắt đầu), kích thước kho và mã vạch? Tùy thuộc vào bản chất của các truy vấn của bạn, bạn có thể nhận được vào thời gian phản hồi khá hợp lý. Cơ sở dữ liệu quan hệ là tốt cho xử lý giao dịch trực tuyến (trong một số thông số thời gian tải và đáp ứng), nhưng công việc phân tích đôi khi đòi hỏi phương pháp và công nghệ của kho dữ liệu thay thế. (Hoặc, có lẽ, cơ sở dữ liệu liên kết ... có các lựa chọn thay thế.)

Tuy nhiên, xét đến Murphy, có thể bạn sẽ có một số truy vấn chạy dài. Dữ liệu có khác nhau cho người dùng cuối khác nhau không? Nếu không, tại sao không tính toán trước câu trả lời? Không có gì dựa trên http nên mất hơn một phút để xử lý, nếu lúc đó - ít nhất là không theo thiết kế!

+0

Pontus, cảm ơn vì những suy nghĩ của bạn. Có vẻ như yêu cầu này sẽ là yêu cầu của SASS, nhưng do các bộ lọc chúng tôi đang chạy trên dữ liệu của mình, tôi muốn một cách tiếp cận có thể đặt chúng trong một vòng lặp while và tiếp tục chạy chúng cho đến ngày bắt đầu> = đến ngày cuối. Một ngày hoặc tất cả chúng.Thời gian truy vấn cho báo cáo này không phải là vấn đề vì đây là các báo cáo loại bằng chứng để xác thực tư duy chiến lược trong khoảng thời gian 50 năm liên quan đến hoạt động giao dịch. Vì vậy, ngay cả khi phải mất ba ngày để chạy, điều quan trọng là cách tiếp cận được xác thực trên một tập hợp lịch sử rất lớn. – MikeMalter

3

Tùy thuộc vào chi tiết cụ thể của bộ lọc, điều này nghe giống như một tác vụ có thể hưởng lợi từ việc song song - chia truy vấn trên nhiều nút tính toán chạy bộ lọc trên tập con (phân đoạn) của dữ liệu. Nếu bộ lọc của bạn tập trung vào phân tích một cổ phiếu trên nhiều dữ liệu thời gian, bạn có thể chia công việc trên biểu tượng cổ phiếu và có nhiều nút tính toán xử lý các biểu tượng chứng khoán khác nhau đồng thời. Nếu bạn cần nghiên cứu mối quan hệ giữa các biểu tượng chứng khoán theo thời gian, có thể sẽ có ý nghĩa hơn khi chia công việc theo khoảng thời gian và kết hợp các kết quả sau khi hoạt động (mapreduce). Đây là một trường hợp ném phần cứng nhiều hơn vào vấn đề thực sự có thể cải thiện đáng kể thời gian đáp ứng. Hãy xem xét ví dụ về công cụ tìm kiếm của Google.

Thông báo trước áp dụng thông thường: xem xét triển khai bộ lọc hiện tại của bạn để biết các nút cổ chai hiệu suất trước tiên. Đảm bảo rằng các bảng bạn đang nhấn được lập chỉ mục thích hợp, vv. Trước tiên, hãy tính toán trước các mối quan hệ và tiêu hóa các tính toán cần thiết thường xuyên. Lưu trữ là giá rẻ nếu nó sẽ tiết kiệm thời gian.

Yêu cầu web của bạn có thể khởi động hoạt động truy vấn phân tán/thu thập phân phối truy vấn đến các nút tính toán có sẵn trong đám mây (Windows Azure, Google Apps, Amazon). Với đủ các nút tính toán và phân phối công việc phù hợp, bạn có thể nhận được phản hồi trong thời gian thực gần.

+0

dthorpe, Có, chúng tôi đang làm việc với PLINQ và truy vấn song song. Tuy nhiên, có một số vấn đề phân loại tôi phải làm việc. Trong một báo cáo tôi nhận được 3 giờ xuống còn 1/2 giờ. Nhưng mỗi khi chúng tôi chạy báo cáo, chúng tôi có kết quả khác nhau. Vì vậy, tôi cần phải nhìn vào nó, nhưng song song không phải là một ưu tiên hoặc yêu cầu vào thời điểm này, tuy nhiên trong tương lai nó sẽ được. Cảm ơn bạn một lần nữa vì những suy nghĩ của bạn. – MikeMalter

1

Tôi không biết tại sao mọi người trả lời ở đây đều muốn tất cả công việc được thực hiện trong cơ sở dữ liệu, nhưng kiểm soát công việc phải ở bên ngoài. Nó giống như đặt khóa đánh lửa cho chiếc xe của bạn ở bên ngoài. Thực ra, tôi biết tại sao. Bạn đã gắn thẻ câu hỏi này với wcf.

Và đề xuất sử dụng "nút tính toán" vừa hoàn thành bingo buzzword của tôi, cảm ơn dthorpe! bạn không cần "tính toán các nút" chỉ là lõi. Hầu hết các RDBMS có PX được xây dựng ngay trong (Parallel Execution). Tại sao phải trả tiền cho điện toán đám mây mà bạn sử dụng hàng ngày, chỉ cần mua một máy chủ có đủ CPU, bạn sẽ ổn ... Không cần truy vấn "thu thập phân tán", chỉ cần bật PX ...

Pontus chỉ bạn đi đúng hướng. Được hài lòng với hiệu suất 6 phút và lo lắng về cách sắp xếp đó là vấn đề của bạn. Có rất nhiều chiến lược để quản lý dữ liệu của bạn thành các định dạng thúc đẩy tốc độ. Chỉ mục, phân vùng, hình khối, IOT. Bạn có thể làm hai loại vượt qua thay vì trong các loại bộ nhớ. Thống kê của bạn có thể đã lỗi thời gây ra kế hoạch xấu.

Tôi giả định rằng bạn đã không thực hiện toàn bộ tấn điều chỉnh db từ kỳ hạn của câu hỏi này. Bạn thực sự nên gửi một câu hỏi điều chỉnh cơ sở dữ liệu (s) và cho chúng tôi biết RDBMS bạn đang sử dụng và làm thế nào đến nay bạn đã điều chỉnh.

+1

Bởi vì cơ sở dữ liệu là nơi dữ liệu sống và 50 năm dữ liệu sẽ là một gigabyte dữ liệu và các tập dữ liệu khổng lồ để truyền xung quanh dưới dạng đối tượng. Tôi không nói rằng nó không thể được thực hiện, nhưng mọi tình huống đều có công đức riêng của mình để thực hiện một số nhiệm vụ trong db, những người khác ở bên ngoài. Trong trường hợp này, tôi sẽ thử và thực hiện càng nhiều càng tốt bộ lọc trên DB, sau đó chuyển dữ liệu ra máy chủ loại báo cáo để thực hiện báo cáo. – Ryk

+0

Stephanie, tình cảm của tôi chính xác. Chúng tôi chỉ đang xúc tiến dữ liệu cổ phiếu tic ra khỏi cơ sở dữ liệu SQL Server của chúng tôi và tiếp tục xử lý nó trong mã nhị phân. Trên thực tế, các cơ sở dữ liệu trên dự án này là đơn giản nhất mà tôi từng tạo ra. Tôi nghĩ rằng chúng tôi thậm chí có thể vừa đạt đến hình thức bình thường thứ hai. Nhưng kích thước của dữ liệu rất lớn. Tôi nghĩ rằng tôi có thể làm rõ hơn câu hỏi của mình bằng cách nói một quy trình 30 giờ thay vì một truy vấn 30 giờ. Cảm ơn bạn đã dành thời gian để chia sẻ suy nghĩ của bạn với tôi. – MikeMalter

+0

Ryk, bạn hiểu nhầm. Đó là phần SAU nhưng tôi không đồng ý. Tôi đã tranh cãi chống lại việc lập kế hoạch và kiểm soát là một dịch vụ trong các cửa sổ hay bất cứ thứ gì khác KHÔNG có trong cơ sở dữ liệu. Đó là dấu phẩy, không phải là dấu chấm. –

2

Tôi khuyên bạn nên đọc bài viết này về Asynchronous Procedure Execution. Nếu bạn logic là cơ sở dữ liệu ràng buộc (mà nó chắc chắn nhất là) thì điều này cung cấp cho một cách hoàn toàn đáng tin cậy để khởi động nhiệm vụ tính toán trong một thời trang không đồng bộ đó là đàn hồi để chuyển đổi dự phòng. Do tải của bạn có khả năng tương thích cao, bạn có thể khởi chạy một số tác vụ, ví dụ:một cho mỗi mã, xem bài viết tiếp theo Passing Parameters to a Background Procedure. Là một lưu ý phụ, kỹ thuật này tận dụng kích hoạt không đồng bộ SQL Server tích hợp được sử dụng bởi ít nhất hai tập đoàn tài chính lớn mà tôi biết, cho chính xác kịch bản tương tự như của bạn.

+0

Remus, cảm ơn bài viết mà tôi chắc chắn sẽ đọc. Cơ sở dữ liệu của chúng tôi không phải là logic ràng buộc nếu tôi hiểu ý nghĩa của bạn. Tôi xem các thủ tục được lưu trữ giống như những cái xẻng hơi nước khổng lồ trong hầm mỏ, chúng là những cỗ máy được tối ưu hóa rất lớn tốt cho việc đào đất để chế biến thêm. Trong trường hợp của chúng tôi, LINQ cho SQL là xẻng của chúng tôi và chúng tôi thực hiện hầu hết việc lọc và phân tích bổ sung của chúng tôi trong mã nhị phân với LINQ. – MikeMalter

+0

Bạn có thể xem xét dịch vụ ngoài quy trình sử dụng cùng một công nghệ, Trình kích hoạt bên ngoài: http://blogs.msdn.com/b/sql_service_broker/archive/2008/11/21/announcing-service-broker-external -activator.aspx. Bạn cần một cách để tính toán lịch biểu đáng tin cậy (nhiệm vụ), và bạn sẽ kết thúc sớm hay muộn xây dựng một hàng đợi trong cơ sở dữ liệu, vì vậy bạn nên bắt đầu với nó. –

+0

Tôi sẽ đi với việc tạo ra một dịch vụ Windows để đọc một bảng xếp hạng báo cáo. Nếu nó bắt đầu nhận được lớn và trông giống như bảo trì sẽ trở thành một vấn đề, chúng tôi sẽ xem xét MSMQ. – MikeMalter

1

Mike,

Có nhiều cách để trả lời câu hỏi này, nhưng câu hỏi quan trọng hơn tôi thấy rằng bạn nên hỏi là, tại sao nó mất 6 phút để lọc cho một cổ phiếu?

Có Tôi biết bạn có 50 năm dữ liệu và rất nhiều cổ phiếu, NHƯNG không nên mất 6 phút. Vì vậy, quan trọng hơn, tôi sẽ xem xét nó cấu trúc bảng cụ thể, các chỉ mục trên đó và truy vấn và những gì nó đang làm.

Tôi đã từng làm việc cho một công ty tương tự, với các bảng có dung lượng gần 100Gb. Có kích thước của bảng, không phải toàn bộ db, và sau khi một số tinh chỉnh có các truy vấn được sử dụng để mất 15 phút + xuống đến 3 giây.

Tôi rất muốn giúp bạn đặc biệt nếu bạn đang chạy trên SQL Server. Gửi email cho tôi ryk99 [at] hotmail [dot] com và chúng tôi sẽ xem những gì chúng tôi có thể làm từ đó.

+0

Ryk, cảm ơn lời đề nghị trợ giúp. Phải mất 6 phút để lọc một cổ phiếu vì có nửa tá bộ lọc đầy đủ các điều kiện và so sánh đi từ hôm nay đến một năm phân tích. Vấn đề đối với tôi không phải là thời gian để thực hiện truy vấn nhiều như cách hỗ trợ mở rộng quy mô. Điều gì sẽ xảy ra khi chúng tôi cần kiểm tra toàn bộ tập dữ liệu của mình để có cách tiếp cận chiến lược để thực hiện giao dịch? Tuy nhiên, trước đó một gợi ý tuyệt vời đã được thực hiện để tạo ra một dịch vụ Windows và thăm dò ý kiến ​​một bảng các tham số. Thời gian chờ duy nhất mà tôi phải lo lắng là SQL CommandTimeout. Cảm ơn một lần nữa. – MikeMalter

0

Bạn có nghĩ đến việc sử dụng giải pháp ETL như SSIS để điền trước dữ liệu của bạn không?

+0

Không, chúng tôi đã không xem xét nó, một phần vì kinh nghiệm của tôi với SSIS là rất ít. Có lẽ tôi nên nhìn vào nó. – MikeMalter

+0

Đó là giá trị nhìn vào (đó là loại SSIS điều được cho là được sử dụng cho), mặc dù nó có một đường cong học tập khá dốc. Nếu kỹ năng SQL của bạn là âm thanh, thì bạn nên có quá nhiều vấn đề, có rất nhiều tài nguyên tốt xung quanh. –

Các vấn đề liên quan