PostgreSQL có thể được mở rộng để chạy mã do người dùng cung cấp trong các quy cách đọc kèo bóng đá riêng biệt. Các quy cách đọc kèo bóng đá như vậy được bắt đầu, dừng và theo dõi bởiPostgres
, cho phép họ có một thời gian trọn đời được liên kết chặt chẽ với trạng thái của máy chủ. Các quy cách đọc kèo bóng đá này được gắn vàoPostgreSQLkhu vực bộ nhớ được chia sẻ và có tùy chọn kết nối với cơ sở dữ liệu bên trong; Họ cũng có thể chạy nhiều giao dịch một cách tự do, giống như một quy cách đọc kèo bóng đá máy chủ kết nối máy khách thông thường.libpqHọ có thể kết nối với máy chủ và hoạt động như một ứng dụng máy khách thông thường.
Có những rủi ro mạnh mẽ và bảo mật đáng kể trong việc sử dụng các quy trình cách đọc kèo bóng đá bởi vì, được viết trongC
Ngôn ngữ, họ có quyền truy cập không giới hạn vào dữ liệu. Các quản trị viên muốn kích hoạt các mô -đun bao gồm các quy trình cách đọc kèo bóng đá nên thực hiện thận trọng cực độ.
cách đọc kèo bóng đá có thể được khởi tạo tại thời điểm đóPostgreSQLđược bắt đầu bằng cách đọc kèo bóng đá bao gồm tên mô -đun trongshared_preload_l Libries
. Một mô -đun muốn chạy một cách đọc kèo bóng đá có thể đăng ký nó bằng cách gọi10160_10187
Từ nóBackidentWorker
*Công cách đọc kèo bóng đá
)_pg_init ()
Hàm. cách đọc kèo bóng đá cũng có thể được bắt đầu sau khi hệ thống hoạt động và chạy bằng cách gọi10452_10486
. Không giống nhưBackidentWorker
*Công cách đọc kèo bóng đá
, BackidentWorkerHandle
**Xử lý
)RegisterBackgroundWorker
, chỉ có thể được gọi từ trong quy cách đọc kèo bóng đá Postmaster,10830_10863
phải được gọi từ phụ trợ thông thường hoặc cách đọc kèo bóng đá khác.
Cấu trúcBackidentWorker
được xác định như vậy:
typedef void (*bgworker_main_type) (datum main_arg);
BGW_NAME
vàBGW_TYPE
là các chuỗi được sử dụng trong các thông báo nhật ký, danh sách xử lý và bối cảnh tương tự.BGW_TYPE
nên giống nhau cho tất cả các cách đọc kèo bóng đá cùng loại, để có thể nhóm các công nhân đó trong một danh sách quy trình, ví dụ.BGW_NAME
Mặt khác có thể chứa thông tin bổ sung về quy cách đọc kèo bóng đá cụ thể. (Thông thường, chuỗi choBGW_NAME
sẽ chứa loại bằng cách đọc kèo bóng đá nào đó, nhưng điều đó không được yêu cầu nghiêm ngặt.)
BGW_FLAGS
là mặt nạ bitwise-or'd cho biết các khả năng mà mô-đun muốn. Các giá trị có thể là:
bgworker_shmem_access
BGWorker_Backend_Database_Connection
Yêu cầu khả năng thiết lập kết nối cơ sở dữ liệu thông qua đó sau này có thể chạy các giao dịch và truy vấn. Một cách đọc kèo bóng đá viên nền bằng cách sử dụngBGWorker_Backend_Database_Connection
Để kết nối với cơ sở dữ liệu cũng phải đính kèm bộ nhớ được chia sẻ bằng cách đọc kèo bóng đá sử dụngBGWorker_Shmem_Access
hoặc công cách đọc kèo bóng đá khởi nghiệp sẽ thất bại.
bgw_start_time
là trạng thái máy chủ trong đóPostgres
nên bắt đầu quá cách đọc kèo bóng đá; Nó có thể là một trong nhữngBGWorkerstart_PostMasterStart
(Bắt đầu ngay sau khiPostgres
Bản thân đã hoàn thành việc khởi tạo riêng; Các quy cách đọc kèo bóng đá yêu cầu điều này không đủ điều kiện cho các kết nối cơ sở dữ liệu),BGWorkerstart_ConsistentState
(Bắt đầu ngay khi đạt được trạng thái nhất quán trong chế độ chờ nóng, cho phép các quy cách đọc kèo bóng đá kết nối với cơ sở dữ liệu và chạy các truy vấn chỉ đọc) vàBGWorkerstart_RecoveryFinished
(Bắt đầu ngay khi hệ thống đã đi vào trạng thái đọc thông thường). Lưu ý hai giá trị cuối cùng tương đương trong một máy chủ không phải là chế độ chờ nóng.
bgw_restart_time
là khoảng thời gian, tính bằng giây, đóPostgres
nên đợi trước khi khởi động lại quy cách đọc kèo bóng đá trong trường hợp nó gặp sự cố. Nó có thể là bất kỳ giá trị dương nào, hoặcbgw_never_restart
, cho biết không khởi động lại quá cách đọc kèo bóng đá trong trường hợp gặp sự cố.
bgw_l Library_name
là tên của một thư viện trong đó nên tìm kiếm điểm nhập cảnh ban đầu cho cách đọc kèo bóng đá. Thư viện được đặt tên sẽ được tải động bởi quy trình công nhân vàBGW_Function_Name
sẽ được sử dụng để xác định chức năng được gọi. Nếu gọi một hàm trong mã lõi, điều này phải được đặt thành"Postgres"
.
BGW_Function_Name
là tên của hàm được sử dụng làm điểm nhập ban đầu cho cách đọc kèo bóng đá mới. Nếu chức năng này nằm trong thư viện được tải động, nó phải được đánh dấuPGDLlexport
(và khôngtĩnh
).
BGW_MAIN_ARG
làDatum
Đối số cho chức năng chính của cách đọc kèo bóng đá. Chức năng chính này sẽ lấy một đối số duy nhất loạiDatum
và trả lạivoid
. BGW_MAIN_ARG
sẽ được thông qua làm đối số. Ngoài ra, biến toàn cầumybgworkerentry
chỉ vào một bản sao củaBackidentWorker
Cấu trúc được thông qua tại thời điểm đăng ký; Công cách đọc kèo bóng đá có thể thấy hữu ích khi kiểm tra cấu trúc này.
trên Windows (và bất cứ nơi nào khác nơiexec_backend
được xác định) hoặc trong cách đọc kèo bóng đá động không an toàn khi vượt quaDatum
Bằng cách đọc kèo bóng đá tham chiếu, chỉ theo giá trị. Nếu một đối số là bắt buộc, việc chuyển INT32 hoặc giá trị nhỏ khác là an toàn nhất và sử dụng nó làm chỉ mục vào một mảng được phân bổ trong bộ nhớ chia sẻ.CSTRING
hoặcText
được thông qua thì con trỏ sẽ không hợp lệ từ quy trình cách đọc kèo bóng đá mới.
BGW_EXTRA
có thể chứa thêm dữ liệu sẽ được truyền cho cách đọc kèo bóng đá. Không giống nhưBGW_MAIN_ARG
, dữ liệu này không được truyền như một đối số cho chức năng chính của công cách đọc kèo bóng đá, nhưng nó có thể được truy cập quamybgworkerentry
, như đã thảo luận ở trên.
bgw_notify_pid
là PID của quy cách đọc kèo bóng đá phụ trợ PostgreSQL mà Postmaster sẽ gửiSigusr1
Khi quá trình được bắt đầu hoặc thoát ra. Nó phải là 0 cho các công cách đọc kèo bóng đá đã đăng ký tại thời gian khởi động bưu điện hoặc khi phụ trợ đăng ký công cách đọc kèo bóng đá không muốn chờ công cách đọc kèo bóng đá khởi động.MyProcPid
.
Sau khi chạy, quá cách đọc kèo bóng đá có thể kết nối với cơ sở dữ liệu bằng cách gọi
hoặcchar *dbname
, char *tên người dùng
, Cờ UINT32
)
. Điều này cho phép quá cách đọc kèo bóng đá chạy các giao dịch và truy vấn bằng cách sử dụngOID DBOID
, OID useroid
, Cờ UINT32
)SPI
Giao diện. Nếu nhưdbname
là null hoặcDBOID
làkhông hợp lệ
, phiên không được kết nối với bất kỳ cơ sở dữ liệu cụ thể nào, nhưng các danh mục được chia sẻ có thể được truy cập. Nếu nhưtên người dùng
là null hoặcuseroid
làkhông hợp lệ
initDB
. Nếu nhưBGWorker_Bypass_allowConn
được chỉ định làCờ
Có thể bỏ qua các hạn chế để kết nối với cơ sở dữ liệu không cho phép kết nối người dùng. Nếu nhưBGWorker_Bypass_RoleloginCheck
được chỉ định làCờ
Có thể bỏ qua kiểm tra đăng nhập cho vai trò được sử dụng để kết nối với cơ sở dữ liệu. Một cách đọc kèo bóng đá viên nền chỉ có thể gọi một trong hai chức năng này và chỉ một lần.
Tín hiệu ban đầu bị chặn khi điều khiển đến chức năng chính của cách đọc kèo bóng đá và phải được bỏ chặn bởi nó; Điều này là để cho phép quá trình tùy chỉnh trình xử lý tín hiệu của nó, nếu cần thiết.19115_19147
và bị chặn bằng cách đọc kèo bóng đá gọi.
nếubgw_restart_time
Đối với một cách đọc kèo bóng đá được cấu hình làbgw_never_restart
hoặc nếu nó thoát với mã thoát 0 hoặc bị chấm dứt bởiChấm dứt công tác việc làm việc
, nó sẽ tự động không được đăng ký bởi người bưu điện khi thoát. Nếu không, nó sẽ được khởi động lại sau khoảng thời gian được cấu hình quabgw_restart_time
hoặc ngay lập tức nếu người bán bưu điện tái tạo cụm do lỗi phụ trợ. Các phụ trợ cần phải tạm dừng thực thi tạm thời nên sử dụng một giấc ngủ bị gián đoạn thay vì thoát;Waitlatch ()
. Đảm bảowl_postmaster_death
cờ được đặt khi gọi hàm đó và xác minh mã trả về để thoát khỏi trường hợp khẩn cấp rằngPostgres
Bản thân nó đã chấm dứt.
Khi một cách đọc kèo bóng đá được đăng ký bằng cách sử dụng20277_20310
Hàm, có thể cho phụ trợ thực hiện đăng ký để có được thông tin liên quan đến trạng thái của người lao động. Phụ trợ muốn làm điều này sẽ chuyển địa chỉ của mộtBackidentWorkerHandle *
là đối số thứ hai cho20600_20633
. Nếu người lao động được đăng ký thành công, con trỏ này sẽ được khởi tạo bằng tay cầm mờ có thể được truyền đếngetbackgroundWorkerPid (
hoặcBackidentWorkerHandle *
, PID_T *
)chấm dứt
. BackidentWorkerHandle *
)GetBackgroundWorkerPid
Có thể được sử dụng để thăm dò tình trạng của công cách đọc kèo bóng đá: Giá trị trả lại củaBGWH_NOT_YET_STARTED
Cho biết rằng người lao động chưa được bắt đầu bởi người bưu điện;bgwh_stopped
cho biết nó đã được bắt đầu nhưng không còn chạy nữa; Vàbgwh_started
cho biết nó hiện đang chạy. Trong trường hợp cuối cùng này, PID cũng sẽ được trả về thông qua đối số thứ hai.21589_21616
khiến người quản lý bưu điện gửisigterm
Đối với công cách đọc kèo bóng đá nếu nó đang chạy và để hủy đăng ký nó ngay khi nó không.
Trong một số trường hợp, một quá trình đăng ký một cách đọc kèo bóng đá có thể muốn chờ người lao động bắt đầu. Điều này có thể được thực hiện bằng cách khởi tạobgw_notify_pid
đếnMyProcPid
và sau đó vượt quaBackidentWorkerHandle *
thu được tại thời điểm đăng ký lênWaitForbackgroundWorkerstartup (
Hàm. Chức năng này sẽ chặn cho đến khi người đưa thư đã cố gắng bắt đầu cách đọc kèo bóng đá viên nền, hoặc cho đến khi người đưa thư chết.BackidentWorkerHandle *Tay cầm
, PID_T *
)bgwh_started
và PID sẽ được ghi vào địa chỉ được cung cấp. Nếu không, giá trị trả về sẽ làbgwh_stopped
hoặcBGWH_POSTMASTER_DIED
.
Một quá trình cũng có thể chờ một cách đọc kèo bóng đá đóng cửa, bằng cách sử dụngWaitForbackgroundWorkershutdown (
Hàm và vượt quaBackidentWorkerHandle *Tay cầm
)BackidentWorkerHandle *
thu được khi đăng ký. Chức năng này sẽ chặn cho đến khi cách đọc kèo bóng đá viên nền thoát ra, hoặc người bán bưu điện chết.bgwh_stopped
, nếu Postmaster chết, nó sẽ trở lạiBGWH_POSTMASTER_DIED
.
cách đọc kèo bóng đá có thể gửi tin nhắn thông báo không đồng bộ, bằng cách sử dụngThông báo
Lệnh quaSPIhoặc trực tiếp quaasync_notify ()
. Thông báo như vậy sẽ được gửi tại cam kết giao dịch.nghe
Lệnh, vì không có cơ sở hạ tầng để người lao động tiêu thụ các thông báo đó.
Thesrc/test/modules/worker_spi
Mô -đun chứa một ví dụ làm việc, thể hiện một số kỹ thuật hữu ích.
Số lượng cách đọc kèo bóng đá đã đăng ký tối đa bị giới hạn bởiMax_Worker_Processes.
Nếu bạn thấy bất cứ điều gì trong tài liệu không chính xác, không khớpMẫu nàyĐể báo cáo vấn đề tài liệu.