Rumah >pembangunan bahagian belakang >Golang >Tamat masa URL websocket mencapai ralat dalam AWS Lambda
Apabila menggunakan Websocket dalam AWS Lambda, kadangkala anda menghadapi ralat tamat masa URL Websocket. Masalah ini boleh mengakibatkan ketidakupayaan untuk mewujudkan atau mengekalkan sambungan ke Websocket, menjejaskan operasi biasa aplikasi. Artikel ini akan memperkenalkan punca dan penyelesaian kepada masalah ini, membantu pembangun menyelesaikan ralat tamat masa URL Websocket dan memastikan kestabilan dan kebolehpercayaan aplikasi. Kedua-dua pembangun pemula dan berpengalaman akan mendapat maklumat berharga tentang AWS Lambda dan Websockets daripada artikel ini.
Saya menggunakan bahasa go untuk membangunkan aws lambda. Saya menggunakan kod go lang, menggunakan imej chromedp dan docker, dan mendapat ralat tamat masa url websocket. Lambda saya ditetapkan kepada memori ram 3008 mb, storan 512mb dan tamat masa 15 minit. Bolehkah anda mengenal pasti masalah dan bagaimana untuk menyelesaikannya? Ini ialah fail main.go
和 dockerfile
Fail main.go
(bahagian chromedp)
func getpage(url string, linenum string, stationnm string) { // settings for crawling ctx, cancle := chromedp.newcontext( context.background(), chromedp.withlogf(log.printf), ) defer cancle() opts := []chromedp.execallocatoroption{ chromedp.disablegpu, chromedp.nosandbox, chromedp.headless, chromedp.flag("no-zygote", true), chromedp.flag("single-process", true), chromedp.flag("homedir", "/tmp"), chromedp.flag("data-path", "/tmp/data-path"), chromedp.flag("disk-cache-dir", "/tmp/cache-dir"), chromedp.flag("remote-debugging-port", "9222"), chromedp.flag("remote-debugging-address", "0.0.0.0"), chromedp.flag("disable-dev-shm-usage", true), } allocctx, cancel := chromedp.newexecallocator(ctx, opts...) defer cancel() ctx, cancel = chromedp.newcontext(allocctx, chromedp.withlogf(log.printf)) defer cancel() var htmlcontent string ch := chromedp.waitnewtarget(ctx, func(i *target.info) bool { return strings.contains(i.url, "/timetable/web/") }) }
Fail dockerfile
FROM public.ecr.aws/lambda/provided:al2 AS build ENV GO111MODULE=on \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64 # Get rid of the extension warning RUN mkdir -p /opt/extensions RUN yum -y install golang RUN go env -w GOPROXY=direct # Clone git, copying go.mod, go.sum, main.go WORKDIR /var/task/ RUN yum install git -y RUN git clone https://github.com/seedspirit/NaverCrawler-CICD-go.git RUN cp NaverCrawler-CICD-go/main.go /var/task/ RUN cp NaverCrawler-CICD-go/go.mod /var/task/ RUN cp NaverCrawler-CICD-go/go.sum /var/task/ # cache dependencies RUN go mod download RUN go build -o main . FROM public.ecr.aws/lambda/provided:al2 COPY --from=build /var/task/main /var/task/main # Install Chrome dependencies RUN curl https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm -o chrome.rpm && \ yum install -y ./chrome.rpm && \ yum install -y fontconfig libX11 GConf2 dbus-x11 ENTRYPOINT ["/var/task/main"]
mencadangkan menggunakan chromedp/headless-shell kerana ia kecil dan lebih sesuai untuk aws lambda.
Saya baru sahaja menguji demo mudah menggunakan chromedp/headless-shell
dan ia berkesan.
dockerfile:
from golang:1.20.4-alpine3.17 as builder workdir /app copy go.mod go.sum ./ run go mod download copy . . run go build -o main from chromedp/headless-shell:113.0.5672.93 workdir /app copy --from=builder /app/main . entrypoint [ "./main" ]
main.go:
package main import ( "context" "encoding/json" "fmt" "log" "os" "github.com/aws/aws-lambda-go/lambda" "github.com/chromedp/chromedp" ) func Handler(_ context.Context, _ json.RawMessage) error { opts := []chromedp.ExecAllocatorOption{ chromedp.NoSandbox, chromedp.Flag("disable-setuid-sandbox", true), chromedp.Flag("disable-dev-shm-usage", true), chromedp.Flag("single-process", true), chromedp.Flag("no-zygote", true), } ctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...) defer cancel() ctx, cancel = chromedp.NewContext(ctx, chromedp.WithDebugf(log.Printf)) defer cancel() var content string if err := chromedp.Run(ctx, chromedp.Tasks{ chromedp.Navigate("https://example.com/"), chromedp.Text("body > div > p:nth-child(2)", &content), }); err != nil { log.Fatal(err) } fmt.Println(content) return nil } func main() { if _, exists := os.LookupEnv("AWS_LAMBDA_RUNTIME_API"); exists { lambda.Start(Handler) } else { err := Handler(context.Background(), nil) if err != nil { log.Fatal(err) } } }
Contoh ini berdasarkan https://github.com/andiedie/chromedp-aws-lambda-example. Ambil perhatian bahawa chromedp.execallocatoroption
yang disenaraikan disalin terus daripada repositori ini. Ia berfungsi, tetapi saya tidak pasti sama ada ini senarai pilihan terbaik. Mungkin anda perlu menyesuaikannya dengan keperluan anda.
Atas ialah kandungan terperinci Tamat masa URL websocket mencapai ralat dalam AWS Lambda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!