Apa kegunaan praktis dari Layanan Windows? [Tutup]

18

Saya baru bekerja dengan Layanan Windows. Meskipun saya telah belajar untuk membuat Layanan Windows di VS2010 saya ingin tahu beberapa cara praktis di mana layanan windows dapat digunakan?

Saya mencoba Googling dengan mengingat konteks saat ini hanya untuk menemukan lebih banyak tutorial tentang cara membuat Layanan Windows.

EDIT pada Penawaran Bounty:

Semua jawabannya bagus tapi saya mencari contoh yang lebih praktis tentang layanan windows dan implikasinya? Ini akan membantu pengembang tahu kapan waktu yang tepat untuk menggunakannya dengan studi kasus.

Karthik Sreenivasan
sumber
28
Contoh praktis? Bagaimana dengan setiap layanan yang berjalan di kotak Windows Anda sekarang?
yannis
3
atau setiap daemon yang berjalan di kotak * nix Anda
jk.
1
Saya suka merekam musik klasik dari radio siaran. Dengan sebuah program, saya harus bangun jam 2 pagi dan tekan tombol "record". Dengan layanan, saya dapat menjadwalkan tindakan di muka dan tidur dengan tenang. Program adalah TV - layanan adalah VCR.
Kilian Foth

Jawaban:

42

Layanan berjalan di latar belakang, bahkan jika tidak ada yang masuk ke mesin. Apa pun yang dapat Anda bayangkan ingin lakukan tanpa mengandalkan seseorang untuk memulai aplikasi dan mengklik tombol adalah kandidat yang baik untuk suatu layanan. Misalnya, memonitor folder dan kapan pun file ditulis untuknya, proseslah dengan cara tertentu. "Server" apa pun yang dapat Anda pikirkan - server web, server ftp, server mail - adalah layanan, dan begitu juga banyak proses latar belakang yang mungkin tidak sering Anda pikirkan.

Beberapa hal yang pernah ditulis sebagai layanan (file cadangan jam 2 pagi, kirim email pengingat jam 3 pagi dll) mungkin lebih baik dilakukan hari ini sebagai tugas yang dijadwalkan, yang memiliki fleksibilitas luar biasa pada Windows 7 dan lebih tinggi, tetapi jika pengembang tidak pernah mempelajarinya, atau sistem harus mendukung XP, Anda juga akan menemukan layanan melakukan tugas-tugas semacam itu.

Kate Gregory
sumber
1
+1. Jawaban yang bagus Jawaban Anda mengingatkan saya pada bagaimana saya menyelesaikan pengambilan cadangan basis data. Sebelumnya untuk mengambil cadangan, kami biasa menjalankan prosedur SQL di server melalui penjadwal yang memanggil exe. Exe yang digunakan untuk pop up dan setelah selesai ditutup dengan sendirinya. Saya pikir layanan windows adalah pilihan yang lebih baik di sini.
Karthik Sreenivasan
8
Tidak, itu tidak akan terjadi. Tugas itu masih tidak perlu mendengarkan koneksi. Tugas yang dijadwalkan adalah cara yang benar untuk menyelesaikan masalah semacam itu.
Wyatt Barnett
2
Saya menjalankan banyak tugas yang dijadwalkan pada NTver <6.0 juga. . .
Wyatt Barnett
1
@Polynomial: Tugas yang dijadwalkan dapat berjalan di bawah akun apa pun, setidaknya untuk apa pun NT5 +. Apa pun yang berjalan tanpa pengawasan perlu melakukan pencatatan sehingga Anda dapat mengetahui mengapa itu gagal.
Wyatt Barnett
1
Penjelasan bagus :). Sistem pencitraan kami saat ini di perusahaan tempat saya bekerja menggunakan layanan Windows secara ekstensif untuk menangani pemrosesan file. Dari saat gambar dipindai ke dalam sistem ke antrian untuk pengindeksan ke pengarsipan dan akhirnya, untuk mengeluarkannya melalui email, pencetakan, atau faks, itu semua adalah layanan Windows.
kelleystar
9

Layanan pada Windows pada dasarnya adalah program yang berjalan tanpa GUI. Server web (seperti apache), server basis data (seperti server mysql & sql), mesin anti-virus, dan server aplikasi / 'middleware' adalah contoh praktis aplikasi yang sering dijalankan sebagai layanan. Mungkin ada klien GUI yang memungkinkan Anda berinteraksi dengan layanan, tetapi layanan itu sendiri tidak memilikinya. Itu hanya berjalan 'di latar belakang', melakukan hal itu. Selain itu, karena layanan dijalankan dengan hak pengguna yang ditetapkan untuk mereka, mereka dapat berjalan sebagai pengguna yang ditugaskanapakah pengguna benar-benar masuk ke mesin. Jadi server database akan memiliki hak akses yang sama terlepas dari orang yang masuk ke mesin pada saat itu, jika ada. Jadi, Anda dapat melihat mengapa itu penting - Anda tidak ingin harus membuat pengguna tetap masuk untuk menjaga server web tetap berjalan, misalnya.

Mereka adalah setara Windows (dalam cara paling praktis) untuk Daemon di * nix.

GrandmasterB
sumber
5

Layanan

Program, rutin, atau proses yang menjalankan fungsi sistem tertentu untuk mendukung program lain, terutama pada level rendah (dekat dengan perangkat keras). Ketika layanan disediakan melalui jaringan, mereka dapat dipublikasikan dalam Active Directory, memfasilitasi administrasi dan penggunaan layanan-sentris.

Saya ingin mengetahui beberapa cara praktis di mana layanan windows dapat digunakan?

Sesuai dengan definisi layanan, Layanan Jendela dan jenis layanan lainnya melakukan banyak fungsi. Dalam konteks ini mesin pencari adalah teman Anda .

Layanan Windows biasanya digunakan ketika aplikasi harus terus berjalan. Anda harus membuat Layanan Windows untuk menjalankan kode di latar belakang, tanpa interaksi pengguna .

Layanan Windows akan berjalan bahkan jika tidak ada yang masuk. Layanan Windows dapat mulai berjalan segera setelah mesin dinyalakan , yang menjadikannya ideal untuk berjalan sebagai server, misalnya server http. Tidak ada yang diperlukan untuk masuk.

Misalnya jika mereka perlu:

  1. Tunggu permintaan masuk. (Suka melalui remoting atau wcf)
  2. Pantau antrian, sistem file, dll. Jika suatu program hanya perlu dijalankan secara berkala, seperti sekali sehari. Biasanya lebih mudah untuk membuat tugas yang dijadwalkan ..
  3. Server apa pun yang menerima koneksi (seperti mail, web, atau server FTP) biasanya harus berupa Layanan Windows.

Saya akan menggunakan layanan karena alasan berikut:

  • Anda tidak perlu menjalankan sesi. Ini bagus untuk keamanan, dan juga mengurangi overhead pada server.
  • Anda mendapatkan beberapa perintah manajemen bawaan gratis
    o Mulai
    o Berhenti
    o Jeda
    o Lanjutkan

  • Anda dapat menangani acara server seperti shutdown.

Tautan dengan informasi tambahan tentang layanan ini:

Di Asp.net - // TODONT: Gunakan Layanan Windows hanya untuk menjalankan proses yang terjadwal
Apa gunanya Layanan WIndows

Niranjan Singh
sumber
Bagaimana Jalankan dengan layanan windows privilege tertinggi? Tugas yang dijadwalkan misalnya adalah kemungkinan tampilan stackoverflow.com/a/11561410/206730 . IMHO, sampel yang lebih baik untuk meminimalkan kurva pembelajaran adalah aplikasi nyata dengan kode sumber lengkap dan pola yang baik
Kiquenet
4

Program interaktif, seperti winform atau WPF, adalah sesuatu yang Anda inginkan untuk dibuka, berinteraksi, dan ditutup oleh pengguna. Tugas terjadwal adalah sesuatu yang ingin Anda jalankan di latar belakang sebagai waktu tertentu - mungkin hanya memulai, melakukan sesuatu, dan berhenti. Sebuah Windows Service adalah sesuatu yang Anda ingin menjalankan semua waktu di latar belakang.

Beberapa keuntungan dari Layanan Windows adalah bahwa ia berjalan tidak peduli pengguna mana yang masuk (atau bahkan jika tidak ada pengguna yang masuk) dan dapat diatur untuk mulai berjalan segera setelah komputer dinyalakan, yang dapat sangat berguna jika sistem di-boot ulang.

Saya biasanya menggunakan layanan ketika saya harus memonitor sesuatu seperti folder atau inbox email.

allen.mn
sumber
3

Karena Anda menambahkan catatan tentang contoh-contoh praktis untuk pertanyaan Anda, saya akan memberikan beberapa contoh layanan yang telah saya tulis untuk aplikasi perusahaan (Anda tidak mengatakan jika Anda seorang programmer aplikasi perusahaan tetapi dugaan saya adalah kebanyakan programmer C # VS2010 adalah) . Saya pikir Anda mencari ide tentang apa yang mungkin ditulis oleh pengembang yang tidak bekerja untuk Microsoft.

Layanan monitor detak jantung yang memeriksa apakah program lain masih berjalan (ini mungkin bekerja sebagai tugas yang dijadwalkan juga, tetapi diimplementasikan sebagai layanan).

Layanan penulisan laporan yang berfungsi melalui antrian permintaan laporan, menjalankan laporan, dan mengirimkannya ke printer yang berbeda tergantung pada printer apa yang sibuk. Ini membantu membongkar cukup banyak pekerjaan dari aplikasi lawas dan memungkinkan laporan berjalan untuk dibagikan oleh beberapa kotak murah yang menjalankan layanan.

Itu diimplementasikan sebagai layanan sehingga akan berjalan terus menerus, mulai secara otomatis pada reboot, dan dapat menggunakan antarmuka layanan windows standar untuk memulai, berhenti, berhenti, dll. Juga, jika itu adalah tugas yang dijadwalkan, perlu memulai mendapatkan data dari program lain atau sumber persisten (antrian, file, database) daripada tersedia untuk panggilan program lain (soket, pipa).

Bagian server dari aplikasi klien / server itu juga diimplementasikan sebagai layanan sehingga akan restart pada reboot, dll. Ada proyek lain dengan .exe yang menjalankan program yang sama bukan sebagai layanan, untuk membuatnya lebih mudah untuk debug pada mesin pengembangan.

Saya harap itu membantu. Namun, jawaban lainnya adalah jawaban umum yang lebih baik, terutama gagasan bahwa tugas terjadwal mungkin lebih mudah untuk ditulis dan dikelola untuk sebagian besar tujuan sekarang.

psr
sumber
+1 Untuk menjelaskan di mana layanan windows digunakan secara detail. Saya memiliki eksposur terbatas pada soket (model Client-Server Berkomunikasi melalui IPAddress melalui port) tetapi belum menggunakan pipa secara umum. Apakah pipa memiliki peran yang sama dengan bermain seperti soket lakukan?
Karthik Sreenivasan
2

Ada banyak kegunaan praktis untuk suatu layanan. Salah satu penggunaan praktis utama adalah interaksi antara UI dan program layanan (atau daemon dalam unix), yang, dalam hal ini, perbedaan antara klien dan server. Server menerima permintaan, memproses permintaan, dan biasanya mengirim balasan. Dengan kata lain, ini melayani permintaan. Pikirkan tentang SQLSERVER, IIS, atau telnet. Seorang klien, biasanya menggunakan server dengan mengirimkan permintaan ke server dan kemudian menampilkan atau memproses balasan. yaitu aplikasi entri data, aplikasi web ... Server hampir selalu diinstal sebagai layanan di windows (atau daemon di unix) dan klien biasanya hanya aplikasi normal dengan gui. Ada banyak kegunaan layanan yang lebih kompleks, tetapi ini adalah yang mungkin paling sering Anda gunakan.

Sebagai contoh: Saat ini saya sedang mengerjakan server video SIP / H323. Ia menerima permintaan dari aplikasi menggunakan SDK yang saya tulis, memprosesnya, dan membalas kembali. Aplikasi server video dipasang sebagai daemon pada mesin linux embeded (itu akan menjadi layanan pada mesin Windows embeded, tetapi siapa yang menggunakan Windows untuk embeded anyways) dan aplikasi apa pun yang menggunakan SDK akan dianggap sebagai klien.

Tentu saja, Anda dapat menulis aplikasi semacam itu dan tidak menjadikannya layanan. Anda masih bisa membuatnya mulai saat menjalankan Windows dan menjalankannya di latar belakang. Namun, ini melibatkan beberapa entri registri dan beberapa finagling dalam kode Anda - jauh lebih mudah untuk menggunakan c api daripada dalam sesuatu seperti .NET. Di sisi lain, Microsoft telah membuat ini lebih mudah dengan menciptakan layanan dan memungkinkan kami untuk mendaftarkannya dengan OS. Jauh lebih sederhana dan lebih mudah diimplementasikan daripada melakukannya secara manual.

Jonathan Henson
sumber
+1 - Hanya untuk memperjelas, layanan di-host di server sebagai layanan windows dan kemudian klien SDK mengirim informasi ke server melalui port untuk mengkomunikasikan data untuk menerima umpan balik. Apakah pemahaman saya benar?
Karthik Sreenivasan
1
@ Karthik, Apakah Anda mengacu pada pola desain atau contoh saya? Jika ke yang pertama, ya .. atau daemon di Unix. Komunikasi akan menjadi beberapa bentuk TCP / IP. Jika Anda merujuk pada contoh saya, server video adalah daemon pada mesin linux yang diembed. SDK berkomunikasi melalui port, server video memiliki loop mendengarkan yang digunakannya untuk memproses permintaan klien.
Jonathan Henson
@ Karthik, omong-omong, tidak harus TCP / IP atau Pipa. Saya telah melihat orang menggunakan sinyal dengan slot untuk melakukan komunikasi antarproses. Namun, pola desainnya sama. Cara Anda berkomunikasi bergantung pada arsitek proyek.
Jonathan Henson
Saya merujuk pada contoh.
Karthik Sreenivasan
2

Contoh program kandidat:

  • Sistem yang harus memantau sumber daya / aplikasi lain dan mengirim laporan (aktivitas pengguna, jenis lalu lintas file tertentu, pemberitahuan kelakuan buruk aplikasi)

  • Sistem yang menawarkan layanan ke aplikasi lokal lainnya (terjemahan, konversi file, pengiriman pesan antar-sistem)

  • Perangkat lunak anti-virus.

Saya pikir ini adalah contoh besar yang tidak dapat dengan mudah dilakukan menggunakan tugas yang dijadwalkan.

linkerro
sumber
+1 untuk contoh. Bisakah Anda memberi tahu lalu lintas file?
Karthik Sreenivasan
1
Misalnya, jika Anda memiliki aplikasi web yang melihat lonjakan sporadis dalam unggahan file, Anda ingin memberi tahu seseorang dari mereka. Juga, ini berlaku untuk sumber daya apa pun yang dapat melihat lonjakan pada waktu yang aneh (misalnya lalu lintas web, penggunaan prosesor) yang mungkin tidak terdeteksi oleh pemeriksaan terjadwal (karena aliasing).
linkerro
2

Contoh favorit saya menggunakan layanan:

  1. Server - program yang melayani permintaan dari klien jarak jauh. Mereka biasanya akan berjalan sebagai layanan untuk memastikan bahwa mereka tersedia tidak peduli apakah ada pengguna yang masuk ke server atau tidak. Menjalankan sebagai layanan juga berarti bahwa server mulai memproses permintaan segera setelah mesin dimulai, tidak ada yang harus masuk ke mesin untuk memulai program setelah mesin dinyalakan kembali dengan alasan apa pun. Server database adalah contoh yang bagus.
  2. Pemrosesan latar belakang - program yang bertanggung jawab untuk memproses data dari sumber data dan menyimpan hasil menjadi target data. Target data seringkali merupakan sumber untuk proses lain, dan seterusnya. Berjalan sebagai layanan memungkinkan program-program itu untuk hanya duduk di sana dan menunggu data tiba. Ini juga memungkinkan pengembang meningkatkan ketahanan pemrosesan dengan memecah proses menjadi beberapa langkah semi-independen.
Krzysztof Kozielczyk
sumber
+1 untuk server basis data. Banyak hal jatuh pada tempatnya. Kita semua menggunakan SqlConnection atau OledbConnection untuk terhubung ke database yang sebenarnya diproses oleh layanan yang berada di server.
Karthik Sreenivasan
2

Berikut adalah contoh penggunaan konsep layanan dengan kode nyata (lihat di bawah).

Apa yang dilakukannya adalah mengonfigurasi bus layanan yang menghabiskan antrian dan mendengarkan pesan dari server web dan GUI klien.

Ketika menerima pesan itu tidak apa logika domain waran, itu menyimpan peristiwa ke disk dan mempublikasikan peristiwa itu ke broker pesan.

Sebagian besar aplikasi yang lebih besar yang secara longgar digabungkan mengimplementasikan semacam arsitektur "pekerja" seperti hal di bawah ini.

Proyek Documently adalah proyek sampel yang telah kami buat untuk orang-orang seperti Anda untuk belajar arsitektur terdistribusi. Anda dapat mengajukan pertanyaan langsung kepada saya di proyek, atau bercabang dan menerapkan beberapa fitur untuk belajar dari dan kemudian mengirimkan permintaan tarik (dan mendapatkan komentar kode).

https://github.com/haf/Documently/blob/master/src/Documently.Domain.Service/Program.cs :

using System.Threading;
using Castle.MicroKernel.Registration;
using Castle.Windsor;
using Documently.Infrastructure;
using Documently.Infrastructure.Installers;
using MassTransit;
using Topshelf;
using log4net;
using log4net.Config;

namespace Documently.Domain.Service
{
    class Program
    {
        private static readonly ILog _Logger = LogManager.GetLogger(typeof (Program));

        private IWindsorContainer _Container;
        private IServiceBus _Bus;

        public static void Main(string[] args)
        {
            Thread.CurrentThread.Name = "Domain Service Main Thread";
            HostFactory.Run(x =>
            {
                x.Service<Program>(s =>
                {
                    s.ConstructUsing(name => new Program());
                    s.WhenStarted(p => p.Start());
                    s.WhenStopped(p => p.Stop());
                });
                x.RunAsLocalSystem();

                x.SetDescription("Handles the domain logic for the Documently Application.");
                x.SetDisplayName("Documently Domain Service");
                x.SetServiceName("Documently.Domain.Service");
            });
        }

        private void Start()
        {
            XmlConfigurator.Configure();
            _Logger.Info("setting up domain service, installing components");

            _Container = new WindsorContainer()
                .Install(
                    new RavenDbServerInstaller(),
                    new CommandHandlerInstaller(),
                    new EventStoreInstaller(),
                    new BusInstaller(Keys.DomainServiceEndpoint)
                    );

            _Container.Register(Component.For<IWindsorContainer>().Instance(_Container));
            _Bus = _Container.Resolve<IServiceBus>();

            _Logger.Info("application configured, started running");
        }

        private void Stop()
        {
            _Logger.Info("shutting down Domain Service");
            _Container.Release(_Bus);
            _Container.Dispose();
        }
    }
}
Henrik
sumber
+1 untuk ilustrasi dengan contoh. Saya akan mencoba menerapkan contoh Anda untuk mendapatkan pemahaman yang lebih baik.
Karthik Sreenivasan
2

Beberapa waktu lalu tim saya menerapkan 3 layanan windows di bank di Brasil, seperti di bawah ini:

  • Antarmuka antara sistem: Kami memiliki aplikasi front-office yang bertanggung jawab atas pemesanan perdagangan di pasar saham, dan aplikasi back-office, yang bertanggung jawab untuk akuntansi dan menghitung biaya perdagangan. Awalnya, komunikasi antar sistem dibuat langsung pada SQL Server, tetapi terlalu banyak masalah penguncian dan penyimpanan membuat sistem menderita dari kinerja yang buruk. Sebuah layanan diimplementasikan untuk terhubung ke database depan dan belakang dan melakukan pembacaan / penulisan yang tepat menggunakan beberapa jenis strategi retensi (alih-alih menulis setiap perdagangan tunggal pada SQL Server, kami menyimpan data untuk beberapa perluasan, katakanlah 1000 perdagangan, dan melakukan penyisipan massal, yang 40x lebih cepat dari solusi asli, dan tidak mengunci banyak tabel yang terlibat untuk waktu yang lama).

  • Antrian Pesan: Seiring dengan solusi sebelumnya, kami menulis penangan antrian pesan khusus, sehingga beberapa prosedur pemrosesan batch dapat berjalan secara tidak sinkron. Itu terintegrasi dengan MSMQ dan IBM-MQSeries.

  • Sentralisasi layanan bisnis: Beberapa aplikasi pengguna memerlukan data umum seperti harga saham, misalnya, jadi kami menulis layanan khusus yang bertanggung jawab untuk menerima "permintaan harga" dan mengirimkan kembali informasi harga.

Salah satu aspek yang mengarahkan kami untuk menulis layanan, alih-alih "robot", adalah bahwa layanan dapat berjalan sebagai pengguna tertentu (seperti seseorang telah ditunjukkan pada utas ini), dan dapat dimulai secara otomatis ketika mesin dinyalakan.

Layanan juga tidak perlu menjalankan desktop atau layanan manajemen jendela. Mereka dapat berjalan di latar belakang (well, mereka harus berlari di latar belakang).

Dan, jika Anda seperti beberapa rekan saya yang tidak suka menulis antarmuka pengguna, layanan adalah tantangan teknologi yang hebat, karena biasanya mereka tidak boleh gagal. Jadi sangat menyenangkan untuk menulis layanan. :)

Machado
sumber
+1 Contoh langsung. Dari semua jawaban baik yang diberikan oleh semua orang di sini saya sekarang mendapatkan pemahaman yang lebih baik tentang penggunaan layanan windows yang tepat dan saya pikir programmer lain pasti akan mendapat manfaat dari berbagi pengetahuan di sini. Beberapa implementasi yang saya telah bekerja di masa lalu bisa lebih baik diimplementasikan menggunakan layanan windows.
Karthik Sreenivasan
0

Jika Anda mendesain aplikasi desktop Windows yang perlu dijalankan sebagai pengguna standar tetapi kadang-kadang perlu melakukan tugas yang memerlukan hak admin Anda dapat menggunakan layanan.

Installer Anda menginstal layanan dengan izin yang diperlukan, aplikasi desktop Anda memanggil ke layanan ketika perlu melakukan tugas dengan hak admin.

Ada implikasi keamanan terhadap pendekatan ini yang berada di luar cakupan jawaban ini.

Jim In Texas
sumber
Jika saya mengerti dengan benar, layanan windows tidak dapat dipanggil tanpa izin admin?
Karthik Sreenivasan
2
Tidak, Layanan Windows tidak dapat diinstal atau dimulai tanpa izin admin. Tetapi setiap pengguna dapat berkomunikasi dengan mereka jika layanan mendengarkan (pikirkan soket, pipa bernama, dll.)
Eclipse
1
Tentu saja pengguna standar dapat memulai dan memanggil layanan windows. Layanan harus diinstal oleh pengguna admin.
Jim In Texas
0

Untuk programmer, alasan utama untuk menggunakan layanan adalah:

  • Program ini perlu memulai secara otomatis pada mesin Windows setelah reboot.

Apa pun yang Anda tulis yang harus sesuai dengan di atas harus dijalankan sebagai Layanan Windows.


sumber
0

Layanan paling berguna yang saya tulis, dari perspektif pengguna akhir:
* Pengguna mencetak faktur UGLY pada printer dot-matrix dengan driver cetak RAW.
* Pengguna menginginkan faktur CUKUP dengan logo, grafik garis halus.
* Tidak ada akses ke kode lawas.

Layanan akan:
* Memantau (beberapa) folder printer untuk pekerjaan cetak.
* Buat PDF faktur.
* PDF akan "mendasari" gambar faktur kosong yang bagus
* Overlay teks mentah
* Cari meta data, berdasarkan folder yang digunakan (IE: printer sedang digunakan)

Maka metadata akan:
* Hasilkan PDF
* dan / atau cetak PDF
* dan / atau file PDF ke folder tujuan akhir
* dan / atau hapus PDF
* dan / atau mengirim email faktur PDF ke pelanggan

Dalam hal ini, ia menangani ghost-script, PLC dan mesin PDF. Sudah berjalan sangat bersih selama bertahun-tahun. Sertakan file log !!!

davidWazy
sumber